Regression Simulations
linear
enhancer

ccle_rnaseq

juvenile

splicing

lss_3m_2r
enhancer

ccle_rnaseq

juvenile

splicing

hier_poly_3m_2r
enhancer

ccle_rnaseq

juvenile

splicing

linear_lss_3m_2r
enhancer

ccle_rnaseq

juvenile

splicing

Classification Simulations
logistic
enhancer

ccle_rnaseq

juvenile

splicing

lss_3m_2r_logistic
enhancer

ccle_rnaseq

juvenile

splicing

hier_poly_3m_2r_logistic
enhancer

ccle_rnaseq

juvenile

splicing

linear_lss_3m_2r_logistic
enhancer

ccle_rnaseq

juvenile

splicing

Robust Simulations
linear
enhancer
Mean Shift = 10

Mean Shift = 25

ccle_rnaseq
Mean Shift = 10

Mean Shift = 25

lss_3m_2r
enhancer
Mean Shift = 10

Mean Shift = 25

ccle_rnaseq
Mean Shift = 10

Mean Shift = 25

hier_poly_3m_2r
enhancer
Mean Shift = 10

Mean Shift = 25

ccle_rnaseq
Mean Shift = 10

Mean Shift = 25

linear_lss_3m_2r
enhancer
Mean Shift = 10

Mean Shift = 25

ccle_rnaseq
Mean Shift = 10

Mean Shift = 25

Correlation Bias Simulations
Main Figures
PVE = 0.1

PVE = 0.4

Number of RF Splits

Entropy Bias Simulations
Main Figures
Average Rank

Number of RF Splits

CCLE Case Study
Summary

Table of Top Genes
|
|
GMDI (ridge)
|
MDI
|
TreeSHAP
|
MDI-oob
|
MDA
|
|
17-AAG
|
|
1
|
MMP24 (1.03)
|
MMP24 (1.06)
|
MMP24 (1.12)
|
MMP24 (1.28)
|
MMP24 (1.47)
|
|
2
|
NQO1 (2.62)
|
NQO1 (2.72)
|
NQO1 (2.72)
|
NQO1 (9.47)
|
NQO1 (2.38)
|
|
3
|
ENSG00000261602 (2.84)
|
ENSG00000261602 (3.38)
|
ENSG00000261602 (3)
|
PCSK1N (205.19)
|
ENSG00000261602 (2.5)
|
|
4
|
PCSK1N (4.94)
|
PCSK1N (5.69)
|
PCSK1N (6.31)
|
CGNL1 (342.66)
|
PCSK1N (19.53)
|
|
5
|
OGDHL (6.78)
|
SH3BP1 (8.69)
|
SH3BP1 (7.5)
|
CDH6 (368.28)
|
OGDHL (35.44)
|
|
AEW541
|
|
1
|
TXNDC5 (1.12)
|
TXNDC5 (1.31)
|
TXNDC5 (1.81)
|
TXNDC5 (1.34)
|
TXNDC5 (1.22)
|
|
2
|
TNFRSF17 (2.5)
|
ATP8B2 (2.5)
|
ATP8B2 (4.59)
|
TNFRSF17 (3.66)
|
TNFRSF17 (2.56)
|
|
3
|
ATP8B2 (2.75)
|
TNFRSF17 (2.56)
|
TNFRSF17 (4.94)
|
ATP8B2 (122.84)
|
ATP8B2 (3.28)
|
|
4
|
IQGAP2 (5.94)
|
LHFPL2 (10.44)
|
TCEAL4 (5.25)
|
TMEM101 (164.28)
|
LHFPL2 (5.66)
|
|
5
|
LHFPL2 (7.19)
|
IQGAP2 (16.09)
|
IQGAP2 (7.44)
|
TCEAL4 (188.97)
|
IQGAP2 (14.81)
|
|
AZD0530
|
|
1
|
VTN (1.97)
|
PRSS57 (3.69)
|
VTN (1.78)
|
VTN (2.16)
|
VTN (124.34)
|
|
2
|
PRSS57 (6.28)
|
VTN (3.84)
|
SYTL1 (8.53)
|
ITGB6 (87.03)
|
SORBS1 (219.27)
|
|
3
|
ITGB6 (7.53)
|
FDFT1 (20.38)
|
ITGB6 (9.62)
|
SYTL1 (163.72)
|
PRSS57 (326.84)
|
|
4
|
SYTL1 (9.19)
|
ITGB6 (22.19)
|
PRSS57 (21.69)
|
STXBP1 (487.53)
|
SLC16A9 (345.5)
|
|
5
|
THEM4 (10.59)
|
SYTL1 (26.56)
|
CLDN16 (36.88)
|
CLDN16 (501.41)
|
SYTL1 (360.81)
|
|
AZD6244
|
|
1
|
SPRY2 (1.59)
|
RNF125 (2.47)
|
ETV4 (3.16)
|
LYZ (2.88)
|
SPRY2 (2.38)
|
|
2
|
LYZ (2.97)
|
LYZ (2.91)
|
SPRY2 (3.5)
|
RNF125 (3)
|
RNF125 (3.38)
|
|
3
|
RNF125 (3.19)
|
ENSG00000257764 (4.19)
|
RNF125 (3.72)
|
SPRY2 (3.97)
|
LYZ (4.31)
|
|
4
|
ENSG00000257764 (4.03)
|
SPRY2 (4.34)
|
TOR4A (4.72)
|
GJB1 (5)
|
ETV4 (5.41)
|
|
5
|
ETV4 (4.97)
|
GJB1 (5.06)
|
KLF3 (5.84)
|
ENSG00000257764 (6.5)
|
GJB1 (5.5)
|
|
Erlotinib
|
|
1
|
SYTL1 (2)
|
CDH3-AS1 (2)
|
SYTL1 (1.53)
|
CDH3 (1.97)
|
SYTL1 (2.53)
|
|
2
|
CDH3 (2.06)
|
CDH3 (2.06)
|
CDH3 (2.34)
|
SYTL1 (2.12)
|
CDH3 (2.72)
|
|
3
|
CDH3-AS1 (2.22)
|
SYTL1 (3.09)
|
CDH3-AS1 (2.94)
|
CDH3-AS1 (2.66)
|
CDH3-AS1 (2.94)
|
|
4
|
EGFR (5.78)
|
EGFR (5.72)
|
GJB3 (6.19)
|
GJB3 (17.25)
|
GJB3 (12.97)
|
|
5
|
GJB3 (6.81)
|
GJB3 (11.62)
|
EGFR (13.75)
|
EGFR (20.75)
|
EGFR (15.81)
|
|
Irinotecan
|
|
1
|
SLFN11 (1)
|
SLFN11 (1.28)
|
SLFN11 (1)
|
SLFN11 (1.19)
|
SLFN11 (1.03)
|
|
2
|
PPIC (2.44)
|
PPIC (2.41)
|
PPIC (2.75)
|
PPIC (2.69)
|
PPIC (2.62)
|
|
3
|
PPIC-AS1 (3.31)
|
PPIC-AS1 (3.25)
|
S100A16 (3.16)
|
PPIC-AS1 (3.09)
|
S100A16 (3.19)
|
|
4
|
S100A16 (3.69)
|
S100A16 (3.28)
|
PPIC-AS1 (3.41)
|
S100A16 (3.38)
|
PPIC-AS1 (3.25)
|
|
5
|
AGAP2 (5.44)
|
AGAP2 (6.97)
|
AGAP2 (6.47)
|
AGAP2 (7.66)
|
AGAP2 (9.38)
|
|
L-685458
|
|
1
|
DEF6 (2)
|
DEF6 (2.12)
|
DEF6 (2.28)
|
DEF6 (1.84)
|
ENSG00000257824 (5.22)
|
|
2
|
ENSG00000257824 (5.44)
|
ENSG00000257824 (6.47)
|
ENSG00000257824 (6.22)
|
ENSG00000257824 (6.69)
|
DEF6 (7.09)
|
|
3
|
PPIC-AS1 (9.38)
|
PPIC-AS1 (21.34)
|
PPIC-AS1 (14.66)
|
RASAL3 (24.16)
|
PPIC-AS1 (16.44)
|
|
4
|
RASAL3 (11.12)
|
P2RX1 (48.66)
|
CTNNA1 (43.38)
|
LAIR1 (59.62)
|
CTNNA1 (29.81)
|
|
5
|
P2RX1 (16.88)
|
RASAL3 (53.22)
|
RASAL3 (46.5)
|
IKZF1 (90.12)
|
LAIR1 (64.72)
|
|
LBW242
|
|
1
|
IGSF3 (1.09)
|
IGSF3 (1.78)
|
IGSF3 (3.53)
|
SERPINB6 (170.56)
|
IGSF3 (1.84)
|
|
2
|
HERC5 (3.81)
|
SH3RF1 (5.06)
|
SERPINB6 (5.12)
|
PINLYP (188.59)
|
IL1R2 (9.19)
|
|
3
|
GBP1 (4.78)
|
GBP1 (5.16)
|
HERC5 (5.94)
|
RGS14 (219.16)
|
SERPINB6 (17)
|
|
4
|
CXCL1 (5.22)
|
RGS14 (8.22)
|
CXCL1 (8.22)
|
GBP1 (323.72)
|
GBP1 (173.62)
|
|
5
|
IL1R2 (5.97)
|
IL1R2 (8.56)
|
GBP1 (9.34)
|
IGSF3 (341.22)
|
CXCL1 (293.03)
|
|
Lapatinib
|
|
1
|
ERBB2 (1.22)
|
ERBB2 (1.38)
|
ERBB2 (1.41)
|
ERBB2 (1.34)
|
PGAP3 (1.81)
|
|
2
|
PGAP3 (1.97)
|
PGAP3 (1.91)
|
PGAP3 (5.31)
|
PGAP3 (2.62)
|
ERBB2 (1.94)
|
|
3
|
GRB7 (3.06)
|
GRB7 (3.31)
|
ENSG00000152022 (5.47)
|
GRB7 (4)
|
GRB7 (4.16)
|
|
4
|
ENSG00000152022 (4.62)
|
ENSG00000152022 (4.78)
|
FAM83H (6.53)
|
ENSG00000152022 (5.09)
|
ENSG00000152022 (5.16)
|
|
5
|
EPHA1 (7.66)
|
IKBIP (9)
|
EPHA1 (7.78)
|
FAM83H (8.91)
|
EPHA1 (10.47)
|
|
Nilotinib
|
|
1
|
TRDC (1.56)
|
TRDC (1.94)
|
TRDC (2.56)
|
PRSS57 (2)
|
TRDC (1.47)
|
|
2
|
PRSS57 (2.41)
|
CISH (2.62)
|
PRSS57 (2.69)
|
TRDC (3.97)
|
PRSS57 (2.69)
|
|
3
|
CISH (2.94)
|
PRSS57 (2.81)
|
CISH (3.56)
|
NRROS (6.47)
|
CISH (3.62)
|
|
4
|
SPN (5.84)
|
SPN (6.53)
|
NRROS (7.78)
|
SPN (14.25)
|
NRROS (10.03)
|
|
5
|
NRROS (6.09)
|
NRROS (11.09)
|
SPN (8.25)
|
KLF13 (15.94)
|
SOCS2 (14.94)
|
|
Nutlin-3
|
|
1
|
ITGAL (3.91)
|
ENSG00000255518 (3.22)
|
MDM2 (1.22)
|
MDM2 (6.09)
|
ENSG00000255518 (4.66)
|
|
2
|
ENSG00000255518 (4)
|
ITGAL (4.25)
|
RPS27L (9.25)
|
ADD3 (49.31)
|
ITGAL (8.28)
|
|
3
|
MDM2 (5.31)
|
ENSG00000261346 (5)
|
DDB2 (10)
|
DDB2 (94.78)
|
ENSG00000261346 (10.69)
|
|
4
|
ENSG00000261346 (5.47)
|
MDM2 (10.22)
|
ITGAL (12.31)
|
ENSG00000261346 (166.88)
|
ENSG00000261332 (178.94)
|
|
5
|
C16orf54 (9.12)
|
ENSG00000261332 (18.41)
|
ENSG00000255518 (14.44)
|
ITGAL (168.94)
|
TP53INP1 (195.06)
|
|
PD-0325901
|
|
1
|
ETV4 (1.03)
|
ETV4 (1.56)
|
ETV4 (1)
|
ETV4 (1.06)
|
ETV4 (1.06)
|
|
2
|
SPRY2 (2.31)
|
GJB1 (3.19)
|
SPRY2 (4.16)
|
GJB1 (4.16)
|
SPRY2 (3.19)
|
|
3
|
GJB1 (4.62)
|
SPRY2 (4.97)
|
TOR4A (4.41)
|
SPRY2 (5.03)
|
TOR4A (5.03)
|
|
4
|
RNF125 (4.94)
|
RNF125 (5.66)
|
KLF3 (5.62)
|
ENSG00000257764 (6.34)
|
GJB1 (5.59)
|
|
5
|
ENSG00000257764 (5.81)
|
ENSG00000257764 (6.47)
|
GJB1 (5.97)
|
KLF3 (7.38)
|
KLF3 (7.41)
|
|
PD-0332991
|
|
1
|
PPIC-AS1 (2.19)
|
PPIC-AS1 (2.78)
|
PPIC-AS1 (2.19)
|
PPIC-AS1 (2.56)
|
PPIC-AS1 (1.84)
|
|
2
|
ENSG00000234648 (2.53)
|
ENSG00000234648 (2.94)
|
ENSG00000234648 (2.62)
|
ENSG00000234648 (2.94)
|
ENSG00000234648 (2.38)
|
|
3
|
PPIC (4.16)
|
SH2D3C (5.06)
|
PPIC (4.22)
|
PPIC (4.12)
|
PPIC (3.22)
|
|
4
|
SH2D3C (4.78)
|
PPIC (5.28)
|
SH2D3C (6.94)
|
SH2D3C (5.16)
|
SH2D3C (6.97)
|
|
5
|
AGAP2 (11.25)
|
TRAF3IP3 (12.03)
|
AGAP2 (11.34)
|
TRAF3IP3 (11.22)
|
RPL32P29 (31.56)
|
|
PF2341066
|
|
1
|
ENAH (1.09)
|
ENAH (1.72)
|
ENAH (1)
|
ENAH (1.12)
|
ENAH (1.16)
|
|
2
|
SELPLG (2.16)
|
SELPLG (2)
|
SELPLG (2.25)
|
SELPLG (2.12)
|
SELPLG (2.09)
|
|
3
|
MET (2.94)
|
MET (2.38)
|
HGF (3.22)
|
MET (4.03)
|
MET (2.97)
|
|
4
|
HGF (4.38)
|
HGF (5.78)
|
MET (4.19)
|
DOK2 (4.56)
|
HGF (5.72)
|
|
5
|
DOK2 (5.44)
|
DOK2 (6.19)
|
DOK2 (5.97)
|
HGF (6.47)
|
DOK2 (6.22)
|
|
PHA-665752
|
|
1
|
ARHGAP4 (1)
|
ARHGAP4 (1)
|
ARHGAP4 (1)
|
ARHGAP4 (1)
|
ARHGAP4 (1)
|
|
2
|
FMNL1-AS1 (2.75)
|
FMNL1-AS1 (3.44)
|
FMNL1-AS1 (2.41)
|
FMNL1-AS1 (2.56)
|
FMNL1-AS1 (2.59)
|
|
3
|
FMNL1 (3.69)
|
FMNL1 (5.75)
|
FMNL1 (3.12)
|
FMNL1 (4.81)
|
FMNL1 (4.59)
|
|
4
|
PGPEP1 (5.75)
|
PGPEP1 (7.91)
|
PGPEP1 (5.81)
|
PGPEP1 (6.91)
|
ACAP1 (9.62)
|
|
5
|
HEY1 (13.88)
|
FDFT1 (12.09)
|
HEY1 (18.69)
|
HEY1 (27.72)
|
HEY1 (12.03)
|
|
PLX4720
|
|
1
|
RXRG (1.34)
|
RXRG (1.78)
|
MMP8 (2.34)
|
RXRG (2.16)
|
RXRG (2)
|
|
2
|
MMP8 (3.09)
|
MMP8 (3.25)
|
RXRG (2.59)
|
MMP8 (2.69)
|
MMP8 (2.69)
|
|
3
|
ENSG00000227297 (4.5)
|
LYST (3.75)
|
LYST (3.88)
|
LYST (5.44)
|
LYST (5.22)
|
|
4
|
LYST (5.09)
|
ENSG00000256673 (7.16)
|
ENSG00000256673 (7.41)
|
ENSG00000256673 (6.84)
|
PLP1 (6.81)
|
|
5
|
ENSG00000256673 (6.59)
|
PLP1 (8.72)
|
PLP1 (9.38)
|
UCN2 (9.62)
|
UCN2 (7.84)
|
|
Paclitaxel
|
|
1
|
MMP24 (1.19)
|
MMP24 (1.25)
|
MMP24 (1.09)
|
MMP24 (1.41)
|
MMP24 (1.28)
|
|
2
|
AGAP2 (1.88)
|
AGAP2 (1.78)
|
AGAP2 (2.06)
|
AGAP2 (2.47)
|
AGAP2 (2.38)
|
|
3
|
BCL2L1 (3.31)
|
BCL2L1 (4.47)
|
BCL2L1 (3.72)
|
SH3BP1 (13.28)
|
PTPN7 (4.25)
|
|
4
|
ABCB1 (5.12)
|
PTPN7 (7.72)
|
P3H3 (5.81)
|
POLR3G (33.34)
|
BCL2L1 (5)
|
|
5
|
SH3BP1 (7.28)
|
P3H3 (8.22)
|
SH3BP1 (6.94)
|
BCL2L1 (71.31)
|
P3H3 (6.53)
|
|
Panobinostat
|
|
1
|
AGAP2 (1.12)
|
AGAP2 (1.31)
|
AGAP2 (1.31)
|
AGAP2 (1.5)
|
AGAP2 (1.44)
|
|
2
|
CCN1 (1.91)
|
CCN1 (1.72)
|
CCN1 (1.69)
|
CCN1 (1.84)
|
CCN1 (1.78)
|
|
3
|
MYOF (4.44)
|
RPL39P5 (4.47)
|
MYOF (4.31)
|
WWTR1 (7.09)
|
RPL39P5 (4.59)
|
|
4
|
RPL39P5 (4.69)
|
WWTR1 (4.78)
|
RPL39P5 (5.28)
|
MYOF (14.97)
|
WWTR1 (5.28)
|
|
5
|
WWTR1 (4.97)
|
AMOTL2 (6.16)
|
WWTR1 (5.69)
|
FTH1P23 (72.56)
|
MYOF (6.22)
|
|
RAF265
|
|
1
|
SYT17 (1.88)
|
SYT17 (2.5)
|
SYT17 (1.34)
|
SYT17 (4.69)
|
SYT17 (2.84)
|
|
2
|
EMILIN2 (3.19)
|
EMILIN2 (5.75)
|
SH2B3 (6.41)
|
SH2B3 (58.62)
|
STAT5A (11.09)
|
|
3
|
STAT5A (6.22)
|
STAT5A (6.59)
|
SLC29A3 (7.66)
|
STAT5A (69.56)
|
SH2B3 (21.03)
|
|
4
|
SH2B3 (6.56)
|
SLC29A3 (12.06)
|
EMILIN2 (8.16)
|
CMTM3 (76.38)
|
SLC29A3 (23.28)
|
|
5
|
RGS10 (8.47)
|
SH2B3 (12.16)
|
STAT5A (8.97)
|
EMILIN2 (310.97)
|
EPHA3 (25.22)
|
|
Sorafenib
|
|
1
|
SPNS3 (1.53)
|
SPNS3 (2.28)
|
TP63 (1.81)
|
SPNS3 (2.25)
|
SPNS3 (1.66)
|
|
2
|
LAIR1 (9.78)
|
ENSG00000273055 (13.78)
|
SPNS3 (4.62)
|
TP63 (19.12)
|
ENSG00000273055 (20.09)
|
|
3
|
ENSG00000273055 (11.59)
|
TP63 (25.81)
|
ENSG00000273055 (13.22)
|
SELPLG (32.88)
|
TP63 (26.78)
|
|
4
|
P2RX1 (13.66)
|
P2RX1 (27.41)
|
FAM117A (20.84)
|
FAM117A (37.03)
|
FAM117A (34.47)
|
|
5
|
TWF1 (13.81)
|
TWF1 (33.34)
|
P2RX1 (26.38)
|
TWF1 (37.56)
|
ABCB6 (49.06)
|
|
TAE684
|
|
1
|
SELPLG (1)
|
SELPLG (1)
|
SELPLG (1)
|
SELPLG (1)
|
SELPLG (1)
|
|
2
|
LAIR1 (4.44)
|
NFIL3 (4.28)
|
ARID3A (5.75)
|
LAIR1 (6.19)
|
LAIR1 (5.47)
|
|
3
|
NFIL3 (4.69)
|
FMNL1-AS1 (6.12)
|
LAIR1 (7.97)
|
FMNL1-AS1 (10.66)
|
NFIL3 (5.75)
|
|
4
|
ARID3A (4.91)
|
LAIR1 (6.41)
|
FMNL1-AS1 (8.41)
|
CPXM1 (11.66)
|
CPXM1 (7.78)
|
|
5
|
FMNL1-AS1 (6.16)
|
PRDM1 (9.69)
|
CPXM1 (10.41)
|
ARID3A (13.84)
|
FMNL1-AS1 (9.03)
|
|
TKI258
|
|
1
|
TWF1 (1.03)
|
TWF1 (1.19)
|
TWF1 (1.09)
|
TWF1 (1.03)
|
TWF1 (1.03)
|
|
2
|
PRSS57 (4.72)
|
PRSS57 (7.03)
|
GPR162 (11.19)
|
GPR162 (72.91)
|
LAT2 (7.5)
|
|
3
|
LAT2 (7.88)
|
LAT2 (8.03)
|
P3H3 (12.34)
|
P3H3 (89.69)
|
PRSS57 (16.5)
|
|
4
|
C16orf54 (12.09)
|
C16orf54 (17.56)
|
PRSS57 (27.19)
|
CFL2 (125.95)
|
CFL2 (113.02)
|
|
5
|
GPX7 (16.56)
|
GPX7 (26.34)
|
LAT2 (28.59)
|
PCDH1 (179.09)
|
SPN (154.38)
|
|
Topotecan
|
|
1
|
SLFN11 (1)
|
SLFN11 (1)
|
SLFN11 (1)
|
SLFN11 (1)
|
SLFN11 (1)
|
|
2
|
PPIC (2.31)
|
PPIC (2.44)
|
PPIC (2.75)
|
PPIC (2.66)
|
PPIC (2.5)
|
|
3
|
PPIC-AS1 (3.19)
|
PPIC-AS1 (3.44)
|
S100A16 (3.81)
|
PPIC-AS1 (3.28)
|
PPIC-AS1 (3.16)
|
|
4
|
S100A16 (5.03)
|
S100A16 (4.16)
|
PPIC-AS1 (3.81)
|
S100A16 (4.06)
|
S100A16 (4.44)
|
|
5
|
HMGB2 (6.25)
|
OSGIN1 (6.41)
|
OSGIN1 (5.81)
|
OSGIN1 (7.31)
|
RASAL3 (6.06)
|
|
ZD-6474
|
|
1
|
DYNLT3 (4.12)
|
MAP3K12 (6.72)
|
MAP3K12 (4.5)
|
MAP3K12 (9.47)
|
TIMP1 (14.59)
|
|
2
|
MAP3K12 (4.75)
|
CTSH (13.56)
|
DYNLT3 (5.31)
|
DYNLT3 (23.91)
|
DYNLT3 (26.09)
|
|
3
|
PIM1 (8.47)
|
DYNLT3 (14.28)
|
TIMP1 (9.25)
|
TIMP1 (172.03)
|
CTSH (27.59)
|
|
4
|
CTSH (11)
|
PIM1 (15.19)
|
SCD5 (14.66)
|
DLG4 (232)
|
DLG4 (56)
|
|
5
|
DLG4 (12.72)
|
DLG4 (15.66)
|
CTSH (15.38)
|
ITGA10 (258.05)
|
SLC16A9 (58.06)
|
17-AAG

AEW541

AZD0530

AZD6244

Erlotinib

Irinotecan

L-685458

LBW242

Lapatinib

Nilotinib

Nutlin-3

PD-0325901

PD-0332991

PF2341066

PHA-665752

PLX4720

Paclitaxel

Panobinostat

RAF265

Sorafenib

TAE684

TKI258

Topotecan

ZD-6474

TCGA BRCA Case Study
Non-zero Stability Scores Per Method

Stability of Top Features

Table of Top Genes
|
Rank
|
GMDI (ridge)
|
GMDI (logistic)
|
MDA
|
TreeSHAP
|
MDI
|
|
1
|
ESR1 (1.66)
|
ESR1 (1.78)
|
ESR1 (4.56)
|
ESR1 (6.56)
|
TPX2 (12.31)
|
|
2
|
FOXA1 (3.34)
|
GATA3 (4.84)
|
FOXA1 (5.62)
|
TPX2 (7.97)
|
ESR1 (14.38)
|
|
3
|
FOXC1 (4.44)
|
TPX2 (5.03)
|
GATA3 (5.69)
|
FOXA1 (15.22)
|
FOXA1 (21.94)
|
|
4
|
GATA3 (6.12)
|
FOXA1 (5.88)
|
MLPH (6.19)
|
GATA3 (16.31)
|
FOXM1 (24.22)
|
|
5
|
AGR3 (7.19)
|
FOXC1 (8.09)
|
TPX2 (7.47)
|
FOXM1 (16.88)
|
GATA3 (24.66)
|
|
6
|
MLPH (8.22)
|
MLPH (10.91)
|
FOXM1 (13.55)
|
MLPH (19.16)
|
MLPH (26.75)
|
|
7
|
TPX2 (8.59)
|
AGR3 (10.94)
|
AGR3 (13.78)
|
CDK1 (21.75)
|
CDK1 (28.84)
|
|
8
|
FOXM1 (19.41)
|
FOXM1 (11.12)
|
FOXC1 (14.62)
|
AGR3 (24.06)
|
FOXC1 (31.41)
|
|
9
|
TBC1D9 (20.44)
|
UBE2C (14.47)
|
TBC1D9 (16.47)
|
MYBL2 (24.22)
|
TBC1D9 (31.72)
|
|
10
|
SFRP1 (21.28)
|
MYBL2 (20.47)
|
KIF2C (22.41)
|
FOXC1 (26.66)
|
AGR3 (31.91)
|
Misspecified Models
linear
enhancer

ccle_rnaseq

juvenile

splicing

lss_3m_2r
enhancer

ccle_rnaseq

juvenile

splicing

hier_poly_3m_2r
enhancer

ccle_rnaseq

juvenile

splicing

linear_lss_3m_2r
enhancer

ccle_rnaseq

juvenile

splicing

Varying Sparsity
linear
juvenile

splicing

lss_3m_2r
juvenile

splicing

hier_poly_3m_2r
juvenile

splicing

linear_lss_3m_2r
juvenile

splicing

Varying # Features
linear
ccle_rnaseq

lss_3m_2r
ccle_rnaseq

hier_poly_3m_2r
ccle_rnaseq

linear_lss_3m_2r
ccle_rnaseq

GMDI Modeling Choices
linear
enhancer
min_samples_per_leaf = 5

min_samples_per_leaf = 1

ccle_rnaseq
min_samples_per_leaf = 5

min_samples_per_leaf = 1

hier_poly_3m_2r
enhancer
min_samples_per_leaf = 5

min_samples_per_leaf = 1

ccle_rnaseq
min_samples_per_leaf = 5

min_samples_per_leaf = 1

LS0tCnRpdGxlOiAiR01ESSBTaW11bGF0aW9uIFJlc3VsdHMgU3VtbWFyeSIKYXV0aG9yOiAiIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclQiAlZCwgJVknKWAiCm91dHB1dDogdnRoZW1lczo6dm1vZGVybgpwYXJhbXM6CiAgcmVzdWx0c19kaXI6IAogICAgbGFiZWw6ICJSZXN1bHRzIGRpcmVjdG9yeSIKICAgIHZhbHVlOiAiL2dsb2JhbC9zY3JhdGNoL3VzZXJzL3RpZmZhbnl0YW5nL2ZlYXR1cmVfaW1wb3J0YW5jZS9yZXN1bHRzX2ZpbmFsLyIKICBzZWVkOgogICAgbGFiZWw6ICJTZWVkIgogICAgdmFsdWU6IDEyMzQ1CiAgZm9yX3BhcGVyOgogICAgbGFiZWw6ICJFeHBvcnQgcGxvdHMgZm9yIHBhcGVyIgogICAgdmFsdWU6IEZBTFNFCiAgdXNlX2NhY2hlZDoKICAgIGxhYmVsOiAiVXNlIGNhY2hlZCAucmRzIGZpbGVzIgogICAgdmFsdWU6IFRSVUUKICBpbnRlcmFjdGl2ZToKICAgIGxhYmVsOiAiSW50ZXJhY3RpdmUgcGxvdHMiCiAgICB2YWx1ZTogRkFMU0UKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCgpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KHBhdGNod29yaykKY2h1bmtfaWR4IDwtIDEKCiMgc2V0IHBhcmFtZXRlcnMKcmVzdWx0c19kaXIgPC0gcGFyYW1zJHJlc3VsdHNfZGlyCnNlZWQgPC0gcGFyYW1zJHNlZWQKZmlndXJlc19kaXIgPC0gZmlsZS5wYXRoKCJmaWd1cmVzIikKaWYgKCFkaXIuZXhpc3RzKGZpbGUucGF0aChmaWd1cmVzX2RpciwgImFwcGVuZGl4IikpKSB7CiAgZGlyLmNyZWF0ZShmaWxlLnBhdGgoZmlndXJlc19kaXIsICJhcHBlbmRpeCIpLCByZWN1cnNpdmUgPSBUUlVFKQp9CgojIG1pc2NlbGxhbmVvdXMgaGVscGVyIHZhcmlhYmxlcwpoZXJpdGFiaWxpdGllcyA8LSBjKDAuMSwgMC4yLCAwLjQsIDAuOCkKZnJhY19sYWJlbF9jb3JydXB0aW9ucyA8LSBjKCIwLjI1IiwgIjAuMTUiLCAiMC4wNSIsICIwIikKY29ycnVwdF9zaXplcyA8LSBjKDAuMDUsIDAuMDI1LCAwLjAxLCAwKQptZWFuX3NoaWZ0cyA8LSBjKDEwLCAyNSkKbWV0cmljIDwtICJyb2NhdWMiCgojIHBsb3Qgb3B0aW9ucwpwb2ludF9zaXplIDwtIDIKbGluZV9zaXplIDwtIDEKZXJyYmFyX3dpZHRoIDwtIDAKaWYgKHBhcmFtcyRpbnRlcmFjdGl2ZSkgewogIHBsb3RfZnVuIDwtIHBsb3RseTo6Z2dwbG90bHkKfSBlbHNlIHsKICBwbG90X2Z1biA8LSBmdW5jdGlvbih4KSB4Cn0KCm1hbnVhbF9jb2xvcl9wYWxldHRlX2Nob2ljZXMgPC0gYygKICAiYmxhY2siLCAiYmxhY2siLCAiIzlCNURGRiIsICJibHVlIiwKICAib3JhbmdlIiwgIiM3MWJlYjciLCAiIzIxOGExZSIsICIjY2MzMzk5IgopCnNob3dfbWV0aG9kc19jaG9pY2VzIDwtIGMoCiAgIkdNRElfcmlkZ2VfUkYiLCAiR01ESV9yaWRnZV9sb29fcjJfUkYiLCAiR01ESV9sb2dpc3RpY19sb2dsb3NzX1JGIiwgIkdNRElfSHViZXJfbG9vX2h1YmVyX2xvc3NfUkYiLAogICJNREFfUkYiLCAiTURJX1JGIiwgIk1ESS1vb2JfUkYiLCAiVHJlZVNIQVBfUkYiCikKbWV0aG9kX2xhYmVsc19jaG9pY2VzIDwtIGMoCiAgIkdNREkgKHJpZGdlKSIsICJHTURJIChyaWRnZSkiLCAiR01ESSAobG9naXN0aWMpIiwgIkdNREkgKEh1YmVyKSIsCiAgIk1EQSIsICJNREkiLCAiTURJLW9vYiIsICJUcmVlU0hBUCIKKQpjb2xvcl9kZiA8LSB0aWJibGU6OnRpYmJsZSgKICBjb2xvciA9IG1hbnVhbF9jb2xvcl9wYWxldHRlX2Nob2ljZXMsCiAgbmFtZSA9IHNob3dfbWV0aG9kc19jaG9pY2VzLAogIGxhYmVsID0gbWV0aG9kX2xhYmVsc19jaG9pY2VzCikKCm1hbnVhbF9jb2xvcl9wYWxldHRlX2FsbCA8LSBOVUxMCnNob3dfbWV0aG9kc19hbGwgPC0gTlVMTAptZXRob2RfbGFiZWxzX2FsbCA8LSBnZ3Bsb3QyOjp3YWl2ZXIoKQoKY3VzdG9tX3RoZW1lIDwtIHZ0aGVtZXM6OnRoZW1lX3Ztb2Rlcm4oCiAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICBheGlzLnRpY2tzID0gZ2dwbG90Mjo6ZWxlbWVudF9saW5lKHNpemUgPSBnZ3Bsb3QyOjpyZWwoMiksIGNvbG91ciA9ICJibGFjayIpLAogIGF4aXMudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBmYWNlID0gInBsYWluIiksCiAgbGVnZW5kLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpCiAgIyBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJwbGFpbiIsIGhqdXN0ID0gMC41KQopCmN1c3RvbV90aGVtZV93aXRoX2xlZ2VuZCA8LSB2dGhlbWVzOjp0aGVtZV92bW9kZXJuKAogIHNpemVfcHJlc2V0ID0gIm1lZGl1bSIsIGJnX2NvbG9yID0gIndoaXRlIiwgZ3JpZF9jb2xvciA9ICJ3aGl0ZSIsCiAgYXhpcy50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAicGxhaW4iKSwKICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gOSksCiAgbGVnZW5kLnRleHQuYWxpZ24gPSAwLAogIHBsb3QudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkKKQpjdXN0b21fdGhlbWVfd2l0aG91dF9sZWdlbmQgPC0gdnRoZW1lczo6dGhlbWVfdm1vZGVybigKICBzaXplX3ByZXNldCA9ICJtZWRpdW0iLCBiZ19jb2xvciA9ICJ3aGl0ZSIsIGdyaWRfY29sb3IgPSAid2hpdGUiLAogIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gInBsYWluIiksCiAgbGVnZW5kLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpLAogIGxlZ2VuZC50ZXh0ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSA5KSwKICBsZWdlbmQudGV4dC5hbGlnbiA9IDAsCiAgcGxvdC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKQopCgpmaWdfaGVpZ2h0IDwtIDYKZmlnX3dpZHRoIDwtIDEwCgpzb3VyY2UoIi4uLy4uL3NjcmlwdHMvdml6LlIiLCBjaGRpciA9IFRSVUUpCmBgYAoKCiMgUmVncmVzc2lvbiBTaW11bGF0aW9ucyB7LnRhYnNldCAudGFic2V0LXZtb2Rlcm59CgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0Ka2VlcF9tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWUgJWluJSBjKCJHTURJX3JpZGdlX1JGIiwgIk1EQV9SRiIsICJNRElfUkYiLCAiTURJLW9vYl9SRiIsICJUcmVlU0hBUF9SRiIpCm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGNvbG9yX2RmJGNvbG9yW2tlZXBfbWV0aG9kc10Kc2hvd19tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWVba2VlcF9tZXRob2RzXQptZXRob2RfbGFiZWxzIDwtIGNvbG9yX2RmJGxhYmVsW2tlZXBfbWV0aG9kc10KYWxwaGFfdmFsdWVzIDwtIGMoMSwgcmVwKDAuNCwgbGVuZ3RoKG1ldGhvZF9sYWJlbHMpIC0gMSkpCmxlZ2VuZF9wb3NpdGlvbiA8LSBjKDAuNzMsIDAuMzUpCgp2YXJ5X3BhcmFtX25hbWUgPC0gImhlcml0YWJpbGl0eV9zYW1wbGVfcm93X24iCnlfbW9kZWxzIDwtIGMoImxpbmVhciIsICJsc3NfM21fMnIiLCAiaGllcl9wb2x5XzNtXzJyIiwgImxpbmVhcl9sc3NfM21fMnIiKQp4X21vZGVscyA8LSBjKCJlbmhhbmNlciIsICJjY2xlX3JuYXNlcSIsICJqdXZlbmlsZSIsICJzcGxpY2luZyIpCgpyZW1vdmVfeF9heGlzX21vZGVscyA8LSBjKCJzcGxpY2luZyIsICJlbmhhbmNlciIpCmtlZXBfbGVnZW5kX3hfbW9kZWxzIDwtIGMoInNwbGljaW5nIiwgImVuaGFuY2VyIikKa2VlcF9sZWdlbmRfeV9tb2RlbHMgPC0gYygibGluZWFyIiwgImxpbmVhcl9sc3NfM21fMnIiKQoKZm9yICh5X21vZGVsIGluIHlfbW9kZWxzKSB7CiAgY2F0KHNwcmludGYoIlxuXG4jIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfVxuXG4iLCB5X21vZGVsKSkKICBmb3IgKHhfbW9kZWwgaW4geF9tb2RlbHMpIHsKICAgIGNhdChzcHJpbnRmKCJcblxuIyMjICVzIFxuXG4iLCB4X21vZGVsKSkKICAgIHBsdF9scyA8LSBsaXN0KCkKICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzX2RncCIsIHhfbW9kZWwsIHlfbW9kZWwpCiAgICBzaW1fdGl0bGUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgeF9tb2RlbCA9PSAiY2NsZV9ybmFzZXEiIH4gIkNDTEUiLAogICAgICB4X21vZGVsID09ICJzcGxpY2luZyIgfiAiU3BsaWNpbmciLAogICAgICB4X21vZGVsID09ICJlbmhhbmNlciIgfiAiRW5oYW5jZXIiLAogICAgICB4X21vZGVsID09ICJqdXZlbmlsZSIgfiAiSnV2ZW5pbGUiCiAgICApCiAgICBtZXRyaWNfbmFtZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICBtZXRyaWMgPT0gInJvY2F1YyIgfiAiQVVST0MiLAogICAgICBtZXRyaWMgPT0gInByYXVjIiB+ICJQUkFVQyIKICAgICkKICAgIGZuYW1lIDwtIGZpbGUucGF0aChyZXN1bHRzX2RpciwgcGFzdGUwKCJnbWRpLnJlZ3Jlc3Npb25fc2ltcy4iLCBzaW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgidmFyeWluZ18iLCB2YXJ5X3BhcmFtX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInNlZWQiLCBzZWVkKSwgInJlc3VsdHMiKQogICAgaWYgKGZpbGUuZXhpc3RzKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkgJiBwYXJhbXMkdXNlX2NhY2hlZCkgewogICAgICByZXN1bHRzIDwtIHJlYWRSRFMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICBpZiAobGVuZ3RoKHNldGRpZmYoc2hvd19tZXRob2RzLCB1bmlxdWUocmVzdWx0cyRtZXRob2QpKSkgPiAwKSB7CiAgICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICB9CiAgICBpZiAocGFyYW1zJGZvcl9wYXBlcikgewogICAgICBmb3IgKGggaW4gaGVyaXRhYmlsaXRpZXMpIHsKICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5ID09ICEhaCkgJT4lCiAgICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICAgIG1ldHJpYyA9IG1ldHJpYywKICAgICAgICAgICAgeF9zdHIgPSAic2FtcGxlX3Jvd19uIiwKICAgICAgICAgICAgZmFjZXRfc3RyID0gTlVMTCwKICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICAgIGxlZ2VuZF9wb3NpdGlvbiA9IGxlZ2VuZF9wb3NpdGlvbiwKICAgICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lLAogICAgICAgICAgICBpbnNpZGVfbGVnZW5kID0gVFJVRQogICAgICAgICAgKSArCiAgICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgICB4ID0gIlNhbXBsZSBTaXplIiwgeSA9IG1ldHJpY19uYW1lLCAKICAgICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIgogICAgICAgICAgKQogICAgICAgIGlmIChoICE9IGhlcml0YWJpbGl0aWVzWzFdKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgIH0KICAgICAgICBpZiAoeF9tb2RlbCAlaW4lIHJlbW92ZV94X2F4aXNfbW9kZWxzKSB7CiAgICAgICAgICBoZWlnaHQgPC0gMi43MgogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueCA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaGVpZ2h0IDwtIDMKICAgICAgICB9CiAgICAgICAgaWYgKCEoKGggPT0gaGVyaXRhYmlsaXRpZXNbbGVuZ3RoKGhlcml0YWJpbGl0aWVzKV0pICYgCiAgICAgICAgICAgICAgKHhfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF94X21vZGVscykgJiAKICAgICAgICAgICAgICAoeV9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3lfbW9kZWxzKSkpIHsKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjpndWlkZXMoY29sb3IgPSAibm9uZSIsIGFscGhhID0gIm5vbmUiKQogICAgICAgIH0KICAgICAgICBwbHRfbHNbW2FzLmNoYXJhY3RlcihoKV1dIDwtIHBsdAogICAgICB9CiAgICAgIHBsdCA8LSBwYXRjaHdvcms6OndyYXBfcGxvdHMocGx0X2xzLCBucm93ID0gMSkKICAgICAgZ2dwbG90Mjo6Z2dzYXZlKAogICAgICAgIGZpbGUucGF0aChmaWd1cmVzX2Rpciwgc3ByaW50ZigicmVncmVzc2lvbl9zaW1zXyVzXyVzXyVzX2VycmJhcnMucGRmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfbW9kZWwsIHhfbW9kZWwsIG1ldHJpYykpLAogICAgICAgIHBsb3QgPSBwbHQsIHVuaXRzID0gImluIiwgd2lkdGggPSAxNCwgaGVpZ2h0ID0gaGVpZ2h0CiAgICAgICkKICAgIH0gZWxzZSB7CiAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgIG1ldHJpYyA9IG1ldHJpYywKICAgICAgICAgIHhfc3RyID0gInNhbXBsZV9yb3dfbiIsCiAgICAgICAgICBmYWNldF9zdHIgPSAiaGVyaXRhYmlsaXR5X25hbWUiLAogICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUKICAgICAgICApICsKICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwKICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIsCiAgICAgICAgICB0aXRsZSA9IHNwcmludGYoIiVzIiwgc2ltX3RpdGxlKQogICAgICAgICkKICAgICAgdnRoZW1lczo6c3ViY2h1bmtpZnkocGxvdF9mdW4ocGx0KSwgaSA9IGNodW5rX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMykKICAgICAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKICAgIH0KICB9Cn0KCmBgYAoKCiMgQ2xhc3NpZmljYXRpb24gU2ltdWxhdGlvbnMgey50YWJzZXQgLnRhYnNldC12bW9kZXJufQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9CmtlZXBfbWV0aG9kcyA8LSBjb2xvcl9kZiRuYW1lICVpbiUgYygiR01ESV9yaWRnZV9SRiIsICJHTURJX2xvZ2lzdGljX2xvZ2xvc3NfUkYiLCAiTURBX1JGIiwgIk1ESV9SRiIsICJNREktb29iX1JGIiwgIlRyZWVTSEFQX1JGIikKbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gY29sb3JfZGYkY29sb3Jba2VlcF9tZXRob2RzXQpzaG93X21ldGhvZHMgPC0gY29sb3JfZGYkbmFtZVtrZWVwX21ldGhvZHNdCm1ldGhvZF9sYWJlbHMgPC0gY29sb3JfZGYkbGFiZWxba2VlcF9tZXRob2RzXQphbHBoYV92YWx1ZXMgPC0gYygxLCAxLCByZXAoMC40LCBsZW5ndGgobWV0aG9kX2xhYmVscykgLSAyKSkKbGVnZW5kX3Bvc2l0aW9uIDwtIGMoMC43MywgMC40KQoKdmFyeV9wYXJhbV9uYW1lIDwtICJmcmFjX2xhYmVsX2NvcnJ1cHRpb25fc2FtcGxlX3Jvd19uIgp5X21vZGVscyA8LSBjKCJsb2dpc3RpYyIsICJsc3NfM21fMnJfbG9naXN0aWMiLCAiaGllcl9wb2x5XzNtXzJyX2xvZ2lzdGljIiwgImxpbmVhcl9sc3NfM21fMnJfbG9naXN0aWMiKQp4X21vZGVscyA8LSBjKCJlbmhhbmNlciIsICJjY2xlX3JuYXNlcSIsICJqdXZlbmlsZSIsICJzcGxpY2luZyIpCgpyZW1vdmVfeF9heGlzX21vZGVscyA8LSBjKCJlbmhhbmNlciIsICJqdXZlbmlsZSIpCmtlZXBfbGVnZW5kX3hfbW9kZWxzIDwtIGMoImVuaGFuY2VyIiwgImp1dmVuaWxlIikKa2VlcF9sZWdlbmRfeV9tb2RlbHMgPC0gYygibG9naXN0aWMiLCAibGluZWFyX2xzc18zbV8ycl9sb2dpc3RpYyIpCgpmb3IgKHlfbW9kZWwgaW4geV9tb2RlbHMpIHsKICBjYXQoc3ByaW50ZigiXG5cbiMjICVzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLnRhYnNldC1zcXVhcmV9XG5cbiIsIHlfbW9kZWwpKQogIGZvciAoeF9tb2RlbCBpbiB4X21vZGVscykgewogICAgY2F0KHNwcmludGYoIlxuXG4jIyMgJXMgXG5cbiIsIHhfbW9kZWwpKQogICAgcGx0X2xzIDwtIGxpc3QoKQogICAgc2ltX25hbWUgPC0gc3ByaW50ZigiJXNfJXNfZGdwIiwgeF9tb2RlbCwgeV9tb2RlbCkKICAgIHNpbV90aXRsZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICB4X21vZGVsID09ICJjY2xlX3JuYXNlcSIgfiAiQ0NMRSIsCiAgICAgIHhfbW9kZWwgPT0gInNwbGljaW5nIiB+ICJTcGxpY2luZyIsCiAgICAgIHhfbW9kZWwgPT0gImVuaGFuY2VyIiB+ICJFbmhhbmNlciIsCiAgICAgIHhfbW9kZWwgPT0gImp1dmVuaWxlIiB+ICJKdXZlbmlsZSIKICAgICkKICAgIG1ldHJpY19uYW1lIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgIG1ldHJpYyA9PSAicm9jYXVjIiB+ICJBVVJPQyIsCiAgICAgIG1ldHJpYyA9PSAicHJhdWMiIH4gIlBSQVVDIgogICAgKQogICAgZm5hbWUgPC0gZmlsZS5wYXRoKHJlc3VsdHNfZGlyLCBwYXN0ZTAoImdtZGkuY2xhc3NpZmljYXRpb25fc2ltcy4iLCBzaW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgidmFyeWluZ18iLCB2YXJ5X3BhcmFtX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInNlZWQiLCBzZWVkKSwgInJlc3VsdHMiKQogICAgaWYgKGZpbGUuZXhpc3RzKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkgJiBwYXJhbXMkdXNlX2NhY2hlZCkgewogICAgICByZXN1bHRzIDwtIHJlYWRSRFMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICBpZiAobGVuZ3RoKHNldGRpZmYoc2hvd19tZXRob2RzLCB1bmlxdWUocmVzdWx0cyRtZXRob2QpKSkgPiAwKSB7CiAgICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICB9CiAgICBpZiAocGFyYW1zJGZvcl9wYXBlcikgewogICAgICBmb3IgKGggaW4gZnJhY19sYWJlbF9jb3JydXB0aW9ucykgewogICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgZHBseXI6OmZpbHRlcihmcmFjX2xhYmVsX2NvcnJ1cHRpb25fbmFtZSA9PSAhIWgpICU+JQogICAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICAgIHhfc3RyID0gInNhbXBsZV9yb3dfbiIsCiAgICAgICAgICAgIGZhY2V0X3N0ciA9IE5VTEwsCiAgICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgICBsZWdlbmRfcG9zaXRpb24gPSBsZWdlbmRfcG9zaXRpb24sCiAgICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZSwKICAgICAgICAgICAgaW5zaWRlX2xlZ2VuZCA9IFRSVUUKICAgICAgICAgICkgKwogICAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwgCiAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIKICAgICAgICAgICkKICAgICAgICBpZiAoaCAhPSBmcmFjX2xhYmVsX2NvcnJ1cHRpb25zWzFdKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgIH0KICAgICAgICBpZiAoeF9tb2RlbCAlaW4lIHJlbW92ZV94X2F4aXNfbW9kZWxzKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS54ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgICAgaGVpZ2h0IDwtIDIuNzIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaGVpZ2h0IDwtIDMKICAgICAgICB9CiAgICAgICAgaWYgKCEoKGggPT0gZnJhY19sYWJlbF9jb3JydXB0aW9uc1tsZW5ndGgoZnJhY19sYWJlbF9jb3JydXB0aW9ucyldKSAmIAogICAgICAgICAgICAgICh4X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeF9tb2RlbHMpICYgCiAgICAgICAgICAgICAgKHlfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF95X21vZGVscykpKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6Z3VpZGVzKGNvbG9yID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikKICAgICAgICB9CiAgICAgICAgcGx0X2xzW1thcy5jaGFyYWN0ZXIoaCldXSA8LSBwbHQKICAgICAgfQogICAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgbnJvdyA9IDEpCiAgICAgIGdncGxvdDI6Omdnc2F2ZSgKICAgICAgICBmaWxlLnBhdGgoZmlndXJlc19kaXIsIHNwcmludGYoImNsYXNzaWZpY2F0aW9uX3NpbXNfJXNfJXNfJXNfZXJyYmFycy5wZGYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9tb2RlbCwgeF9tb2RlbCwgbWV0cmljKSksCiAgICAgICAgcGxvdCA9IHBsdCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDE0LCBoZWlnaHQgPSBoZWlnaHQKICAgICAgKQogICAgfSBlbHNlIHsKICAgICAgcGx0IDwtIHJlc3VsdHMgJT4lCiAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgeF9zdHIgPSAic2FtcGxlX3Jvd19uIiwKICAgICAgICAgIGZhY2V0X3N0ciA9ICJmcmFjX2xhYmVsX2NvcnJ1cHRpb25fbmFtZSIsCiAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZQogICAgICAgICkgKwogICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICB4ID0gIlNhbXBsZSBTaXplIiwgeSA9IG1ldHJpY19uYW1lLAogICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIiwKICAgICAgICAgIHRpdGxlID0gc3ByaW50ZigiJXMiLCBzaW1fdGl0bGUpCiAgICAgICAgKQogICAgICB2dGhlbWVzOjpzdWJjaHVua2lmeShwbG90X2Z1bihwbHQpLCBpID0gY2h1bmtfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zKQogICAgICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQogICAgfQogIH0KfQpgYGAKCgojIFJvYnVzdCBTaW11bGF0aW9ucyB7LnRhYnNldCAudGFic2V0LXZtb2Rlcm59CgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0Ka2VlcF9tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWUgJWluJSBjKCJHTURJX3JpZGdlX2xvb19yMl9SRiIsICJHTURJX0h1YmVyX2xvb19odWJlcl9sb3NzX1JGIiwgIk1EQV9SRiIsICJNRElfUkYiLCAiTURJLW9vYl9SRiIsICJUcmVlU0hBUF9SRiIpCm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGNvbG9yX2RmJGNvbG9yW2tlZXBfbWV0aG9kc10Kc2hvd19tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWVba2VlcF9tZXRob2RzXQptZXRob2RfbGFiZWxzIDwtIGNvbG9yX2RmJGxhYmVsW2tlZXBfbWV0aG9kc10KYWxwaGFfdmFsdWVzIDwtIGMoMSwgMSwgcmVwKDAuNCwgbGVuZ3RoKG1ldGhvZF9sYWJlbHMpIC0gMikpCmxlZ2VuZF9wb3NpdGlvbiA8LSBjKDAuNzMsIDAuNCkKCnZhcnlfcGFyYW1fbmFtZSA8LSAiY29ycnVwdF9zaXplX3NhbXBsZV9yb3dfbiIKeV9tb2RlbHMgPC0gYygibGluZWFyIiwgImxzc18zbV8yciIsICJoaWVyX3BvbHlfM21fMnIiLCAibGluZWFyX2xzc18zbV8yciIpCnhfbW9kZWxzIDwtIGMoImVuaGFuY2VyIiwgImNjbGVfcm5hc2VxIikKCnJlbW92ZV94X2F4aXNfbW9kZWxzIDwtIGMoMTApCmtlZXBfbGVnZW5kX3hfbW9kZWxzIDwtIGMoImVuaGFuY2VyIiwgImNjbGVfcm5hc2VxIikKa2VlcF9sZWdlbmRfeV9tb2RlbHMgPC0gYygibGluZWFyIiwgImxpbmVhcl9sc3NfM21fMnIiKQprZWVwX2xlZ2VuZF9tZWFuX3NoaWZ0cyA8LSBjKDEwKQoKZm9yICh5X21vZGVsIGluIHlfbW9kZWxzKSB7CiAgY2F0KHNwcmludGYoIlxuXG4jIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfVxuXG4iLCB5X21vZGVsKSkKICBmb3IgKHhfbW9kZWwgaW4geF9tb2RlbHMpIHsKICAgIGNhdChzcHJpbnRmKCJcblxuIyMjICVzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLnRhYnNldC1jaXJjbGV9IFxuXG4iLCB4X21vZGVsKSkKICAgIHNpbV90aXRsZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICB4X21vZGVsID09ICJjY2xlX3JuYXNlcSIgfiAiQ0NMRSIsCiAgICAgIHhfbW9kZWwgPT0gInNwbGljaW5nIiB+ICJTcGxpY2luZyIsCiAgICAgIHhfbW9kZWwgPT0gImVuaGFuY2VyIiB+ICJFbmhhbmNlciIsCiAgICAgIHhfbW9kZWwgPT0gImp1dmVuaWxlIiB+ICJKdXZlbmlsZSIKICAgICkKICAgIG1ldHJpY19uYW1lIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgIG1ldHJpYyA9PSAicm9jYXVjIiB+ICJBVVJPQyIsCiAgICAgIG1ldHJpYyA9PSAicHJhdWMiIH4gIlBSQVVDIgogICAgKQogICAgZm9yIChtZWFuX3NoaWZ0IGluIG1lYW5fc2hpZnRzKSB7CiAgICAgIGNhdChzcHJpbnRmKCJcblxuIyMjIyBNZWFuIFNoaWZ0ID0gJXMgXG5cbiIsIG1lYW5fc2hpZnQpKQogICAgICBwbHRfbHMgPC0gbGlzdCgpCiAgICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzXyVzTVNfcm9idXN0X2RncCIsIHhfbW9kZWwsIHlfbW9kZWwsIG1lYW5fc2hpZnQpCiAgICAgIGZuYW1lIDwtIGZpbGUucGF0aChyZXN1bHRzX2RpciwgcGFzdGUwKCJnbWRpLnJvYnVzdF9zaW1zLiIsIHNpbV9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInZhcnlpbmdfIiwgdmFyeV9wYXJhbV9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInNlZWQiLCBzZWVkKSwgInJlc3VsdHMiKQogICAgICBpZiAoZmlsZS5leGlzdHMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKSAmIHBhcmFtcyR1c2VfY2FjaGVkKSB7CiAgICAgICAgcmVzdWx0cyA8LSByZWFkUkRTKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgICBpZiAobGVuZ3RoKHNldGRpZmYoc2hvd19tZXRob2RzLCB1bmlxdWUocmVzdWx0cyRtZXRob2QpKSkgPiAwKSB7CiAgICAgICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMoKQogICAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMoKQogICAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICB9CiAgICAgIGlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgICAgICAgdG1wIDwtIHJlc3VsdHMgJT4lCiAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGNvcnJ1cHRfc2l6ZV9uYW1lICVpbiUgY29ycnVwdF9zaXplcywKICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kICVpbiUgc2hvd19tZXRob2RzKSAlPiUKICAgICAgICAgIGRwbHlyOjpncm91cF9ieShzYW1wbGVfcm93X24sIGNvcnJ1cHRfc2l6ZV9uYW1lLCBtZXRob2QpICU+JQogICAgICAgICAgZHBseXI6OnN1bW1hcmlzZShtZWFuID0gbWVhbiguZGF0YVtbbWV0cmljXV0pKQogICAgICAgIG1pbl95IDwtIG1pbih0bXAkbWVhbikKICAgICAgICBtYXhfeSA8LSBtYXgodG1wJG1lYW4pCiAgICAgICAgZm9yIChoIGluIGNvcnJ1cHRfc2l6ZXMpIHsKICAgICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGNvcnJ1cHRfc2l6ZV9uYW1lID09ICEhaCkgJT4lCiAgICAgICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICAgICAgeF9zdHIgPSAic2FtcGxlX3Jvd19uIiwKICAgICAgICAgICAgICBmYWNldF9zdHIgPSBOVUxMLAogICAgICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgICAgIGxlZ2VuZF9wb3NpdGlvbiA9IGxlZ2VuZF9wb3NpdGlvbiwKICAgICAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUsCiAgICAgICAgICAgICAgaW5zaWRlX2xlZ2VuZCA9IFRSVUUKICAgICAgICAgICAgKSArCiAgICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwgCiAgICAgICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIgogICAgICAgICAgICApCiAgICAgICAgICBpZiAoaCAhPSBjb3JydXB0X3NpemVzWzFdKSB7CiAgICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgICB9CiAgICAgICAgICBpZiAobWVhbl9zaGlmdCAlaW4lIHJlbW92ZV94X2F4aXNfbW9kZWxzKSB7CiAgICAgICAgICAgIGhlaWdodCA8LSAyLjcyCiAgICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoZWlnaHQgPC0gMwogICAgICAgICAgfQogICAgICAgICAgaWYgKCEoKGggPT0gY29ycnVwdF9zaXplc1tsZW5ndGgoY29ycnVwdF9zaXplcyldKSAmIAogICAgICAgICAgICAgICAgKG1lYW5fc2hpZnQgJWluJSBrZWVwX2xlZ2VuZF9tZWFuX3NoaWZ0cykgJgogICAgICAgICAgICAgICAgKHhfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF94X21vZGVscykgJiAKICAgICAgICAgICAgICAgICh5X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeV9tb2RlbHMpKSkgewogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6Z3VpZGVzKGNvbG9yID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikKICAgICAgICAgIH0KICAgICAgICAgIHBsdF9sc1tbYXMuY2hhcmFjdGVyKGgpXV0gPC0gcGx0CiAgICAgICAgfQogICAgICAgIHBsdCA8LSBwYXRjaHdvcms6OndyYXBfcGxvdHMocGx0X2xzLCBucm93ID0gMSkKICAgICAgICBnZ3Bsb3QyOjpnZ3NhdmUoCiAgICAgICAgICBmaWxlLnBhdGgoZmlndXJlc19kaXIsIHNwcmludGYoInJvYnVzdF9zaW1zXyVzXyVzXyVzTVNfJXNfZXJyYmFycy5wZGYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X21vZGVsLCB4X21vZGVsLCBtZWFuX3NoaWZ0LCBtZXRyaWMpKSwKICAgICAgICAgIHBsb3QgPSBwbHQsIHVuaXRzID0gImluIiwgd2lkdGggPSAxNCwgaGVpZ2h0ID0gaGVpZ2h0CiAgICAgICAgKQogICAgICB9IGVsc2UgewogICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICAgIHhfc3RyID0gInNhbXBsZV9yb3dfbiIsCiAgICAgICAgICAgIGZhY2V0X3N0ciA9ICJjb3JydXB0X3NpemVfbmFtZSIsCiAgICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUKICAgICAgICAgICkgKwogICAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwKICAgICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIiwKICAgICAgICAgICAgdGl0bGUgPSBzcHJpbnRmKCIlcyIsIHNpbV90aXRsZSkKICAgICAgICAgICkKICAgICAgICB2dGhlbWVzOjpzdWJjaHVua2lmeShwbG90X2Z1bihwbHQpLCBpID0gY2h1bmtfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMpCiAgICAgICAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKICAgICAgfQogICAgfQogIH0KfQoKYGBgCgoKIyBDb3JyZWxhdGlvbiBCaWFzIFNpbXVsYXRpb25zIHsudGFic2V0IC50YWJzZXQtdm1vZGVybn0KCiMjIE1haW4gRmlndXJlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9Cm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGMoImJsYWNrIiwgIiMyMThhMWUiLCAib3JhbmdlIiwgIiM3MWJlYjciLCAiI2NjMzM5OSIpCnNob3dfbWV0aG9kcyA8LSBjKCJHTURJIiwgIk1ESS1vb2IiLCAiTURBIiwgIk1ESSIsICAiVHJlZVNIQVAiKQptZXRob2RfbGFiZWxzIDwtIGMoIkdNREkgKHJpZGdlKSIsICJNREktb29iIiwgIk1EQSIsICJNREkiLCAiVHJlZVNIQVAiKQoKY3VzdG9tX2NvbG9yX3BhbGV0dGUgPC0gYygiIzM4NzYxZCIsICIjOWRjODliIiwgIiM5OTE1MDAiKQprZWVwX2hlcml0YWJpbGl0aWVzIDwtIGMoMC4xLCAwLjQpCnNpbV9uYW1lIDwtICJnbWRpLm1kaV9iaWFzX3NpbXMuY29ycmVsYXRpb25fc2ltcy5ub3JtYWxfYmxvY2tfY29yX3BhcnRpYWxfbGluZWFyX2xzc19kZ3AiCmZuYW1lIDwtIGZpbGUucGF0aCgKICByZXN1bHRzX2RpciwgCiAgc2ltX25hbWUsCiAgInZhcnlpbmdfaGVyaXRhYmlsaXR5X3JobyIsCiAgc3ByaW50Zigic2VlZCVzIiwgc2VlZCksCiAgInJlc3VsdHMuY3N2IgopCnJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZm5hbWUpICU+JQogIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5X25hbWUgJWluJSBrZWVwX2hlcml0YWJpbGl0aWVzKQoKbiA8LSAyNTAKcCA8LSAxMDAKc2lnX2lkcyA8LSAwOjUKY25zaWdfaWRzIDwtIDY6NDkKbnJlcHMgPC0gbGVuZ3RoKHVuaXF1ZShyZXN1bHRzJHJlcCkpCgojIyMjIEV4YW1pbmUgYXZlcmFnZSByYW5rIGFjcm9zcyB2YXJ5aW5nIGNvcnJlbGF0aW9uIGxldmVscyAjIyMjCnBsdF9iYXNlIDwtIHBsb3RfcGVydHVyYmF0aW9uX3N0YWJpbGl0eSgKICByZXN1bHRzLAogIGZhY2V0X3Jvd3MgPSAiaGVyaXRhYmlsaXR5X25hbWUiLAogIGZhY2V0X2NvbHMgPSAicmhvX25hbWUiLAogIHBhcmFtX25hbWUgPSBOVUxMLAogIHNpZ19pZHMgPSBzaWdfaWRzLAogIGNuc2lnX2lkcyA9IGNuc2lnX2lkcywKICBwbG90X3R5cGVzID0gImVycmJhciIsCiAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMKKQoKZm9yIChpZHggaW4gMTpsZW5ndGgoa2VlcF9oZXJpdGFiaWxpdGllcykpIHsKICBoIDwtIGtlZXBfaGVyaXRhYmlsaXRpZXNbaWR4XQogIGNhdChzcHJpbnRmKCJcblxuIyMjIFBWRSA9ICVzXG5cbiIsIGgpKQogIHBsdF9kZiA8LSBwbHRfYmFzZSRhZ2dbW2lkeF1dJGRhdGEKICBwbHRfbHMgPC0gbGlzdCgpCiAgZm9yIChtZXRob2QgaW4gbWV0aG9kX2xhYmVscykgewogICAgcGx0X2xzW1ttZXRob2RdXSA8LSBwbHRfZGYgJT4lCiAgICAgIGRwbHlyOjpmaWx0ZXIoZmkgPT0gbWV0aG9kKSAlPiUKICAgICAgZ2dwbG90Mjo6Z2dwbG90KCkgKwogICAgICBnZ3Bsb3QyOjphZXMoeCA9IHJob19uYW1lLCB5ID0gLm1lYW4sIGNvbG9yID0gZ3JvdXApICsKICAgICAgZ2dwbG90Mjo6Z2VvbV9saW5lKCkgKwogICAgICBnZ3Bsb3QyOjpnZW9tX3JpYmJvbigKICAgICAgICBnZ3Bsb3QyOjphZXMoeCA9IHJob19uYW1lLCAKICAgICAgICAgICAgICAgICAgICAgeW1pbiA9IC5tZWFuIC0gKC5zZCAvIHNxcnQobnJlcHMpKSwgCiAgICAgICAgICAgICAgICAgICAgIHltYXggPSAubWVhbiArICguc2QgLyBzcXJ0KG5yZXBzKSksIAogICAgICAgICAgICAgICAgICAgICBmaWxsID0gZ3JvdXApLCAKICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFLCBhbHBoYSA9IDAuMgogICAgICApICsKICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICB4ID0gZXhwcmVzc2lvbigiQ29ycmVsYXRpb24gKCIqcmhvKiIpIiksIAogICAgICAgIHkgPSAiQXZlcmFnZSBSYW5rIiwgCiAgICAgICAgY29sb3IgPSAiRmVhdHVyZVxuR3JvdXAiLCAKICAgICAgICB0aXRsZSA9IG1ldGhvZAogICAgICApICsKICAgICAgZ2dwbG90Mjo6Y29vcmRfY2FydGVzaWFuKAogICAgICAgIHlsaW0gPSBjKG1pbihwbHRfZGYkLm1lYW4pIC0gMywgbWF4KHBsdF9kZiQubWVhbikgKyAzKQogICAgICApICsKICAgICAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfbWFudWFsKAogICAgICAgIHZhbHVlcyA9IGN1c3RvbV9jb2xvcl9wYWxldHRlLCBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkKICAgICAgKSArCiAgICAgIGdncGxvdDI6OnNjYWxlX2ZpbGxfbWFudWFsKAogICAgICAgIHZhbHVlcyA9IGN1c3RvbV9jb2xvcl9wYWxldHRlLCBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkKICAgICAgKSArCiAgICAgIGdncGxvdDI6Omd1aWRlcyhmaWxsID0gIm5vbmUiLCBsaW5ldHlwZSA9ICJub25lIikgKwogICAgICB2dGhlbWVzOjp0aGVtZV92bW9kZXJuKAogICAgICAgIHNpemVfcHJlc2V0ID0gIm1lZGl1bSIsIGJnX2NvbG9yID0gIndoaXRlIiwgZ3JpZF9jb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgYXhpcy50aWNrcyA9IGdncGxvdDI6OmVsZW1lbnRfbGluZShzaXplID0gZ2dwbG90Mjo6cmVsKDIpLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBheGlzLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCwgZmFjZSA9ICJwbGFpbiIpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICAgICAgcGxvdC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KQogICAgICApCiAgICBpZiAobWV0aG9kICE9IG1ldGhvZF9sYWJlbHNbMV0pIHsKICAgICAgcGx0X2xzW1ttZXRob2RdXSA8LSBwbHRfbHNbW21ldGhvZF1dICsKICAgICAgICBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aWNrcy55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgfQogIH0KICAKICBwbHRfd2lkZSA8LSBwYXRjaHdvcms6OndyYXBfcGxvdHMocGx0X2xzLCBndWlkZXMgPSAiY29sbGVjdCIsIG5yb3cgPSAxKQogIGlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgICBnZ3Bsb3QyOjpnZ3NhdmUocGx0X3dpZGUsIGZpbGVuYW1lID0gZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCBzcHJpbnRmKCJjb3JyZWxhdGlvbl9zaW1fcHZlJXNfd2lkZS5wZGYiLCBoKSksCiAgICAgICAgICAgICAgICAgICAgIyBoZWlnaHQgPSBmaWdfaGVpZ2h0ICogLjU1LCB3aWR0aCA9IGZpZ193aWR0aCAqIC4yNSAqIGxlbmd0aChzaG93X21ldGhvZHMpKQogICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAuNTUsIHdpZHRoID0gZmlnX3dpZHRoICogLjMgKiBsZW5ndGgoc2hvd19tZXRob2RzKSkKICB9IGVsc2UgewogICAgdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgICAgIHBsdF93aWRlLCBpID0gY2h1bmtfaWR4LCBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCAqIC44LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMKICAgICkKICAgIGNodW5rX2lkeCA8LSBjaHVua19pZHggKyAxCiAgfQp9CgoKIyMjIyBFeGFtaW5lIG51bWJlciBvZiBzcGxpdHMgYWNyb3NzIHZhcnlpbmcgY29ycmVsYXRpb24gbGV2ZWxzICMjIyMKY2F0KCJcblxuIyMjIE51bWJlciBvZiBSRiBTcGxpdHMgXG5cbiIpCnJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZm5hbWUpICU+JQogIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5X25hbWUgJWluJSBrZWVwX2hlcml0YWJpbGl0aWVzLAogICAgICAgICAgICAgICAgZmkgPT0gIk1ESV93aXRoX3NwbGl0cyIpCgp0b3RhbF9zcGxpdHMgPC0gcmVzdWx0cyAlPiUKICBkcGx5cjo6Z3JvdXBfYnkocmhvX25hbWUsIGhlcml0YWJpbGl0eSwgcmVwKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKG5fc3BsaXRzID0gc3VtKGF2X3NwbGl0cykpCgpwbHRfZGYgPC0gcmVzdWx0cyAlPiUKICBkcGx5cjo6bGVmdF9qb2luKAogICAgdG90YWxfc3BsaXRzLCBieSA9IGMoInJob19uYW1lIiwgImhlcml0YWJpbGl0eSIsICJyZXAiKQogICkgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIGF2X3NwbGl0cyA9IGF2X3NwbGl0cyAvIG5fc3BsaXRzICogMTAwLAogICAgZ3JvdXAgPSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICB2YXIgJWluJSBzaWdfaWRzIH4gIlNpZyIsCiAgICAgIHZhciAlaW4lIGNuc2lnX2lkcyB+ICJDLU5TaWciLAogICAgICBUUlVFIH4gIk5TaWciCiAgICApCiAgKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgZ3JvdXAgPSBmYWN0b3IoZ3JvdXAsIGxldmVscyA9IGMoIlNpZyIsICJDLU5TaWciLCAiTlNpZyIpKQogICkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KHJob19uYW1lLCBoZXJpdGFiaWxpdHksIGdyb3VwKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKAogICAgLm1lYW4gPSBtZWFuKGF2X3NwbGl0cyksCiAgICAuc2QgPSBzZChhdl9zcGxpdHMpCiAgKQoKbWluX3kgPC0gbWluKHBsdF9kZiQubWVhbikKbWF4X3kgPC0gbWF4KHBsdF9kZiQubWVhbikKCnBsdF9scyA8LSBsaXN0KCkKZm9yIChpZHggaW4gMTpsZW5ndGgoa2VlcF9oZXJpdGFiaWxpdGllcykpIHsKICBoIDwtIGtlZXBfaGVyaXRhYmlsaXRpZXNbaWR4XQogIHBsdCA8LSBwbHRfZGYgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKGhlcml0YWJpbGl0eSA9PSAhIWgpICU+JQogICAgZ2dwbG90Mjo6Z2dwbG90KCkgKwogICAgZ2dwbG90Mjo6YWVzKHggPSByaG9fbmFtZSwgeSA9IC5tZWFuLCBjb2xvciA9IGdyb3VwKSArCiAgICBnZ3Bsb3QyOjpnZW9tX2xpbmUoc2l6ZSA9IDEpICsKICAgICMgZ2dwbG90Mjo6Z2VvbV9yaWJib24oCiAgICAjICAgZ2dwbG90Mjo6YWVzKHggPSByaG9fbmFtZSwgCiAgICAjICAgICAgICAgICAgICAgIHltaW4gPSAubWVhbiAtICguc2QgLyBzcXJ0KG5yZXBzKSksIAogICAgIyAgICAgICAgICAgICAgICB5bWF4ID0gLm1lYW4gKyAoLnNkIC8gc3FydChucmVwcykpLCAKICAgICMgICAgICAgICAgICAgICAgZmlsbCA9IGdyb3VwKSwgCiAgICAjICAgaW5oZXJpdC5hZXMgPSBGQUxTRSwgYWxwaGEgPSAwLjIKICAgICMgKSArCiAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICB4ID0gZXhwcmVzc2lvbigiQ29ycmVsYXRpb24gKCIqcmhvKiIpIiksIAogICAgICB5ID0gIlBlcmNlbnRhZ2Ugb2YgU3BsaXRzIGluIFJGICglKSIsCiAgICAgIGNvbG9yID0gIkZlYXR1cmVcbkdyb3VwIiwgCiAgICAgIHRpdGxlID0gc3ByaW50ZigiUFZFID0gJXMiLCBoKQogICAgKSArCiAgICBnZ3Bsb3QyOjpjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMobWluX3ksIG1heF95KSkgKwogICAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfbWFudWFsKAogICAgICB2YWx1ZXMgPSBjdXN0b21fY29sb3JfcGFsZXR0ZSwgZ3VpZGUgPSBnZ3Bsb3QyOjpndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpCiAgICApICsKICAgIGdncGxvdDI6OnNjYWxlX2ZpbGxfbWFudWFsKAogICAgICB2YWx1ZXMgPSBjdXN0b21fY29sb3JfcGFsZXR0ZSwgZ3VpZGUgPSBnZ3Bsb3QyOjpndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpCiAgICApICsKICAgIGdncGxvdDI6Omd1aWRlcyhmaWxsID0gIm5vbmUiLCBsaW5ldHlwZSA9ICJub25lIikgKwogICAgdnRoZW1lczo6dGhlbWVfdm1vZGVybigKICAgICAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICAgICAgYXhpcy50aWNrcyA9IGdncGxvdDI6OmVsZW1lbnRfbGluZShzaXplID0gZ2dwbG90Mjo6cmVsKDIpLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgYXhpcy50ZXh0ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gInBsYWluIiksCiAgICAgIGxlZ2VuZC50ZXh0ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgIGxlZ2VuZC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTgpLAogICAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpCiAgICApCiAgaWYgKGlkeCAhPSAxKSB7CiAgICBwbHQgPC0gcGx0ICsKICAgICAgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogIH0KICBwbHRfbHNbW2lkeF1dIDwtIHBsdAp9CgpwbHRfd2lkZSA8LSBwYXRjaHdvcms6OndyYXBfcGxvdHMocGx0X2xzLCBndWlkZXMgPSAiY29sbGVjdCIsIG5yb3cgPSAxKQppZiAocGFyYW1zJGZvcl9wYXBlcikgewogIGdncGxvdDI6Omdnc2F2ZShwbHRfd2lkZSAmIGdncGxvdDI6OnRoZW1lKHBsb3QudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpLCAKICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJjb3JyZWxhdGlvbl9zaW1fbnVtX3NwbGl0cy5wZGYiKSwKICAgICAgICAgICAgICAgICAgd2lkdGggPSBmaWdfd2lkdGggKiAxLCBoZWlnaHQgPSBmaWdfaGVpZ2h0ICogLjY1KQp9IGVsc2UgewogIHZ0aGVtZXM6OnN1YmNodW5raWZ5KAogICAgcGx0X3dpZGUsIGkgPSBjaHVua19pZHgsIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMKICApCiAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKfQoKYGBgCgojIyBBcHBlbmRpeCBGaWd1cmVzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLnRhYnNldC1zcXVhcmV9CgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0KbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gYygiYmxhY2siLCAiZ3JheSIpCnNob3dfbWV0aG9kcyA8LSBjKCJHTURJIiwgIkdNRElfaW5iYWciKQptZXRob2RfbGFiZWxzIDwtIGMoIkdNREkgKExPTykiLCAiR01ESSAoaW4tYmFnKSIpCgpjdXN0b21fY29sb3JfcGFsZXR0ZSA8LSBjKCIjMzg3NjFkIiwgIiM5ZGM4OWIiLCAiIzk5MTUwMCIpCmtlZXBfaGVyaXRhYmlsaXRpZXMgPC0gYygwLjEsIDAuNCkKc2ltX25hbWUgPC0gImdtZGkubWRpX2JpYXNfc2ltcy5jb3JyZWxhdGlvbl9zaW1zLm5vcm1hbF9ibG9ja19jb3JfcGFydGlhbF9saW5lYXJfbHNzX2RncCIKZm5hbWUgPC0gZmlsZS5wYXRoKAogIHJlc3VsdHNfZGlyLCAKICBzaW1fbmFtZSwKICAidmFyeWluZ19oZXJpdGFiaWxpdHlfcmhvIiwKICBzcHJpbnRmKCJzZWVkJXMiLCBzZWVkKSwKICAicmVzdWx0cy5jc3YiCikKcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkgJT4lCiAgZHBseXI6OmZpbHRlcihoZXJpdGFiaWxpdHlfbmFtZSAlaW4lIGtlZXBfaGVyaXRhYmlsaXRpZXMpCgpuIDwtIDI1MApwIDwtIDEwMApzaWdfaWRzIDwtIDA6NQpjbnNpZ19pZHMgPC0gNjo0OQpucmVwcyA8LSBsZW5ndGgodW5pcXVlKHJlc3VsdHMkcmVwKSkKCiMjIyMgRXhhbWluZSBhdmVyYWdlIHJhbmsgYWNyb3NzIHZhcnlpbmcgY29ycmVsYXRpb24gbGV2ZWxzICMjIyMKcGx0X2Jhc2UgPC0gcGxvdF9wZXJ0dXJiYXRpb25fc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZmFjZXRfcm93cyA9ICJoZXJpdGFiaWxpdHlfbmFtZSIsCiAgZmFjZXRfY29scyA9ICJyaG9fbmFtZSIsCiAgcGFyYW1fbmFtZSA9IE5VTEwsCiAgc2lnX2lkcyA9IHNpZ19pZHMsCiAgY25zaWdfaWRzID0gY25zaWdfaWRzLAogIHBsb3RfdHlwZXMgPSAiZXJyYmFyIiwKICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscwopCgpmb3IgKGlkeCBpbiAxOmxlbmd0aChrZWVwX2hlcml0YWJpbGl0aWVzKSkgewogIGggPC0ga2VlcF9oZXJpdGFiaWxpdGllc1tpZHhdCiAgY2F0KHNwcmludGYoIlxuXG4jIyMgUFZFID0gJXNcblxuIiwgaCkpCiAgcGx0X2RmIDwtIHBsdF9iYXNlJGFnZ1tbaWR4XV0kZGF0YQogIHBsdF9scyA8LSBsaXN0KCkKICBmb3IgKG1ldGhvZCBpbiBtZXRob2RfbGFiZWxzKSB7CiAgICBwbHRfbHNbW21ldGhvZF1dIDwtIHBsdF9kZiAlPiUKICAgICAgZHBseXI6OmZpbHRlcihmaSA9PSBtZXRob2QpICU+JQogICAgICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgICAgIGdncGxvdDI6OmFlcyh4ID0gcmhvX25hbWUsIHkgPSAubWVhbiwgY29sb3IgPSBncm91cCkgKwogICAgICBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSArCiAgICAgIGdncGxvdDI6Omdlb21fcmliYm9uKAogICAgICAgIGdncGxvdDI6OmFlcyh4ID0gcmhvX25hbWUsIAogICAgICAgICAgICAgICAgICAgICB5bWluID0gLm1lYW4gLSAoLnNkIC8gc3FydChucmVwcykpLCAKICAgICAgICAgICAgICAgICAgICAgeW1heCA9IC5tZWFuICsgKC5zZCAvIHNxcnQobnJlcHMpKSwgCiAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBncm91cCksIAogICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsIGFscGhhID0gMC4yCiAgICAgICkgKwogICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgIHggPSBleHByZXNzaW9uKCJDb3JyZWxhdGlvbiAoIipyaG8qIikiKSwgCiAgICAgICAgeSA9ICJBdmVyYWdlIFJhbmsiLCAKICAgICAgICBjb2xvciA9ICJGZWF0dXJlXG5Hcm91cCIsIAogICAgICAgIHRpdGxlID0gbWV0aG9kCiAgICAgICkgKwogICAgICBnZ3Bsb3QyOjpjb29yZF9jYXJ0ZXNpYW4oCiAgICAgICAgeWxpbSA9IGMobWluKHBsdF9kZiQubWVhbikgLSAzLCBtYXgocGx0X2RmJC5tZWFuKSArIDMpCiAgICAgICkgKwogICAgICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9tYW51YWwoCiAgICAgICAgdmFsdWVzID0gY3VzdG9tX2NvbG9yX3BhbGV0dGUsIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKQogICAgICApICsKICAgICAgZ2dwbG90Mjo6c2NhbGVfZmlsbF9tYW51YWwoCiAgICAgICAgdmFsdWVzID0gY3VzdG9tX2NvbG9yX3BhbGV0dGUsIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKQogICAgICApICsKICAgICAgZ2dwbG90Mjo6Z3VpZGVzKGZpbGwgPSAibm9uZSIsIGxpbmV0eXBlID0gIm5vbmUiKSArCiAgICAgIHZ0aGVtZXM6OnRoZW1lX3Ztb2Rlcm4oCiAgICAgICAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICAgICAgICBheGlzLnRpY2tzID0gZ2dwbG90Mjo6ZWxlbWVudF9saW5lKHNpemUgPSBnZ3Bsb3QyOjpyZWwoMiksIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGF4aXMudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gInBsYWluIiksCiAgICAgICAgbGVnZW5kLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpCiAgICAgICkKICAgIGlmIChtZXRob2QgIT0gbWV0aG9kX2xhYmVsc1sxXSkgewogICAgICBwbHRfbHNbW21ldGhvZF1dIDwtIHBsdF9sc1tbbWV0aG9kXV0gKwogICAgICAgIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICB9CiAgfQogIAogIHBsdF93aWRlIDwtIHBhdGNod29yazo6d3JhcF9wbG90cyhwbHRfbHMsIGd1aWRlcyA9ICJjb2xsZWN0IiwgbnJvdyA9IDEpCiAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgIGdncGxvdDI6Omdnc2F2ZShwbHRfd2lkZSwgCiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJhcHBlbmRpeCIsIHNwcmludGYoImNvcnJlbGF0aW9uX3NpbV9wdmUlc193aWRlX2FwcGVuZGl4LnBkZiIsIGgpKSwKICAgICAgICAgICAgICAgICAgICAjIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAuNTUsIHdpZHRoID0gZmlnX3dpZHRoICogLjI1ICogbGVuZ3RoKHNob3dfbWV0aG9kcykpCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gZmlnX2hlaWdodCAqIC41NSwgd2lkdGggPSBmaWdfd2lkdGggKiAuMzcgKiBsZW5ndGgoc2hvd19tZXRob2RzKSkKICB9IGVsc2UgewogICAgdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgICAgIHBsdF93aWRlLCBpID0gY2h1bmtfaWR4LCBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zCiAgICApCiAgICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQogIH0KfQpgYGAKCgojIEVudHJvcHkgQmlhcyBTaW11bGF0aW9ucyB7LnRhYnNldCAudGFic2V0LXZtb2Rlcm59CgojIyBNYWluIEZpZ3VyZXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQojIyMjIEVudHJvcHkgUmVncmVzc2lvbiBSZXN1bHRzICMjIyMKbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gcmV2KGMoImJsYWNrIiwgIm9yYW5nZSIsICIjNzFiZWI3IiwgIiMyMThhMWUiLCAiI2NjMzM5OSIpKQpzaG93X21ldGhvZHMgPC0gcmV2KGMoIkdNREkiLCAiTURBIiwgIk1ESSIsICJNREktb29iIiwgIlRyZWVTSEFQIikpCm1ldGhvZF9sYWJlbHMgPC0gcmV2KGMoIkdNREkgKHJpZGdlKSIsICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiKSkKYWxwaGFfdmFsdWVzIDwtIHJldihjKDEsIHJlcCgwLjcsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDEpKSkKeV9saW1pdHMgPC0gYygxLCA0LjUpCgptZXRyaWNfbmFtZSA8LSAiQVVST0MiCnNpbV9uYW1lIDwtICJnbWRpLm1kaV9iaWFzX3NpbXMuZW50cm9weV9zaW1zLmxpbmVhcl9kZ3AiCmZuYW1lIDwtIGZpbGUucGF0aCgKICByZXN1bHRzX2RpciwgCiAgc2ltX25hbWUsCiAgInZhcnlpbmdfaGVyaXRhYmlsaXR5X24iLAogIHNwcmludGYoInNlZWQlcyIsIHNlZWQpLAogICJyZXN1bHRzLmNzdiIKKQoKIyMjIyBFbnRyb3B5IFJlZ3Jlc3Npb24gQXZnIFJhbmsgIyMjIwpyZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKGZuYW1lKSAlPiUKICBkcGx5cjo6ZmlsdGVyKGhlcml0YWJpbGl0eV9uYW1lID09IDAuMSkKCmN1c3RvbV9ncm91cF9mdW4gPC0gZnVuY3Rpb24odmFyKSB2YXIKCnBsdF9iYXNlIDwtIHBsb3RfcGVydHVyYmF0aW9uX3N0YWJpbGl0eSgKICByZXN1bHRzLAogIGZhY2V0X3Jvd3MgPSAiaGVyaXRhYmlsaXR5X25hbWUiLAogIGZhY2V0X2NvbHMgPSAibl9uYW1lIiwgCiAgZ3JvdXBfZnVuID0gY3VzdG9tX2dyb3VwX2Z1biwgCiAgcGFyYW1fbmFtZSA9IE5VTEwsCiAgcGxvdF90eXBlcyA9ICJlcnJiYXIiLAogIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzCikKCnBsdF9kZiA8LSBwbHRfYmFzZSRhZ2dbWzFdXSRkYXRhCm5yZXBzIDwtIGxlbmd0aCh1bmlxdWUocmVzdWx0cyRyZXApKQoKcGx0X3JlZ3Jlc3Npb24gPC0gcGx0X2RmICU+JQogIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMCkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gbl9uYW1lLCB5ID0gLm1lYW4sIGNvbG9yID0gZmksIGFscGhhID0gZmkpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoc2l6ZSA9IGxpbmVfc2l6ZSkgKwogIGdncGxvdDI6OmxhYnMoCiAgICB4ID0gIlNhbXBsZSBTaXplIiwgCiAgICB5ID0gZXhwcmVzc2lvbigiQXZlcmFnZSBSYW5rIG9mICIqWFsxXSksIAogICAgY29sb3IgPSAiTWV0aG9kIiwKICAgIHRpdGxlID0gIlJlZ3Jlc3Npb24iCiAgKSArCiAgZ2dwbG90Mjo6Z3VpZGVzKGZpbGwgPSAibm9uZSIsIGFscGhhID0gIm5vbmUiKSArCiAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBnZ3Bsb3QyOjpzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYWxwaGFfdmFsdWVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBnZ3Bsb3QyOjpndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpKSArCiAgZ2dwbG90Mjo6Y29vcmRfY2FydGVzaWFuKHlsaW0gPSB5X2xpbWl0cykgKwogIHZ0aGVtZXM6OnRoZW1lX3Ztb2Rlcm4oCiAgICBzaXplX3ByZXNldCA9ICJtZWRpdW0iLCBiZ19jb2xvciA9ICJ3aGl0ZSIsIGdyaWRfY29sb3IgPSAid2hpdGUiLAogICAgYXhpcy50aWNrcyA9IGdncGxvdDI6OmVsZW1lbnRfbGluZShzaXplID0gZ2dwbG90Mjo6cmVsKDIpLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgIGF4aXMudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgYXhpcy50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTgsIGZhY2UgPSAicGxhaW4iKSwKICAgIGxlZ2VuZC50ZXh0ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICBsZWdlbmQudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgIHBsb3QudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBmYWNlID0gImJvbGQiLCBoanVzdCA9IDAuNSkKICApCgojIyMjIEVudHJvcHkgUmVncmVzc2lvbiAjIFNwbGl0cyAjIyMjCnJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZm5hbWUpICU+JQogIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5X25hbWUgPT0gMC4xLCAKICAgICAgICAgICAgICAgIGZpID09ICJNRElfd2l0aF9zcGxpdHMiKQoKbnJlcHMgPC0gbGVuZ3RoKHVuaXF1ZShyZXN1bHRzJHJlcCkpCgp0b3RhbF9zcGxpdHMgPC0gcmVzdWx0cyAlPiUKICBkcGx5cjo6Z3JvdXBfYnkobl9uYW1lLCBoZXJpdGFiaWxpdHksIHJlcCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShuX3NwbGl0cyA9IHN1bShhdl9zcGxpdHMpKQoKcmVncmVzc2lvbl9udW1fc3BsaXRzX2RmIDwtIHJlc3VsdHMgJT4lCiAgZHBseXI6OmxlZnRfam9pbigKICAgIHRvdGFsX3NwbGl0cywgYnkgPSBjKCJuX25hbWUiLCAiaGVyaXRhYmlsaXR5IiwgInJlcCIpCiAgKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgYXZfc3BsaXRzID0gYXZfc3BsaXRzIC8gbl9zcGxpdHMgKiAxMDAKICApICU+JQogIGRwbHlyOjpncm91cF9ieShuX25hbWUsIGhlcml0YWJpbGl0eSwgdmFyKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKAogICAgLm1lYW4gPSBtZWFuKGF2X3NwbGl0cyksCiAgICAuc2QgPSBzZChhdl9zcGxpdHMpCiAgKQoKIyMjIyBFbnRyb3B5IENsYXNzaWZpY2F0aW9uIFJlc3VsdHMgIyMjIwptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSByZXYoYygiYmxhY2siLCAiIzlCNURGRiIsICJvcmFuZ2UiLCAiIzcxYmViNyIsICIjMjE4YTFlIiwgIiNjYzMzOTkiKSkKc2hvd19tZXRob2RzIDwtIHJldihjKCJHTURJX3JpZGdlIiwgIkdNRElfbG9naXN0aWNfbG9nbG9zcyIsICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiKSkKbWV0aG9kX2xhYmVscyA8LSByZXYoYygiR01ESSAocmlkZ2UpIiwgIkdNREkgKGxvZ2lzdGljKSIsICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiKSkKYWxwaGFfdmFsdWVzIDwtIHJldihjKDEsIDEsIHJlcCgwLjcsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDIpKSkKCm1ldHJpY19uYW1lIDwtICJBVVJPQyIKc2ltX25hbWUgPC0gImdtZGkubWRpX2JpYXNfc2ltcy5lbnRyb3B5X3NpbXMubG9naXN0aWNfZGdwIgpmbmFtZSA8LSBmaWxlLnBhdGgoCiAgcmVzdWx0c19kaXIsIAogIHNpbV9uYW1lLAogICJ2YXJ5aW5nX2NfbiIsCiAgc3ByaW50Zigic2VlZCVzIiwgc2VlZCksCiAgInJlc3VsdHMuY3N2IgopCgojIyMjIEVudHJvcHkgQ2xhc3NpZmljYXRpb24gQXZnIFJhbmsgIyMjIwpyZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKGZuYW1lKQoKY3VzdG9tX2dyb3VwX2Z1biA8LSBmdW5jdGlvbih2YXIpIHZhcgoKcGx0X2Jhc2UgPC0gcGxvdF9wZXJ0dXJiYXRpb25fc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZmFjZXRfcm93cyA9ICJjX25hbWUiLAogIGZhY2V0X2NvbHMgPSAibl9uYW1lIiwgCiAgZ3JvdXBfZnVuID0gY3VzdG9tX2dyb3VwX2Z1biwgCiAgZGVzY2VuZGluZ19tZXRob2RzID0gIkdNREkgKGxvZ2lzdGljKSIsCiAgcGFyYW1fbmFtZSA9IE5VTEwsCiAgcGxvdF90eXBlcyA9ICJlcnJiYXIiLAogIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzCikKCnBsdF9kZiA8LSBwbHRfYmFzZSRhZ2dbWzFdXSRkYXRhCm5yZXBzIDwtIGxlbmd0aCh1bmlxdWUocmVzdWx0cyRyZXApKQoKcGx0X2NsYXNzaWZpY2F0aW9uIDwtIHBsdF9kZiAlPiUKICBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDApICU+JQogIGdncGxvdDI6OmdncGxvdCgpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG5fbmFtZSwgeSA9IC5tZWFuLCBjb2xvciA9IGZpLCBhbHBoYSA9IGZpKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKHNpemUgPSBsaW5lX3NpemUpICsKICBnZ3Bsb3QyOjpsYWJzKAogICAgeCA9ICJTYW1wbGUgU2l6ZSIsIAogICAgeSA9IGV4cHJlc3Npb24oIkF2ZXJhZ2UgUmFuayBvZiAiKlhbMV0pLCAKICAgIGNvbG9yID0gIk1ldGhvZCIsCiAgICB0aXRsZSA9ICJDbGFzc2lmaWNhdGlvbiIKICApICsKICBnZ3Bsb3QyOjpndWlkZXMoZmlsbCA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIGdncGxvdDI6OnNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBhbHBoYV92YWx1ZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBnZ3Bsb3QyOjpjb29yZF9jYXJ0ZXNpYW4oCiAgICB5bGltID0geV9saW1pdHMKICApICsKICB2dGhlbWVzOjp0aGVtZV92bW9kZXJuKAogICAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICAgIGF4aXMudGlja3MgPSBnZ3Bsb3QyOjplbGVtZW50X2xpbmUoc2l6ZSA9IGdncGxvdDI6OnJlbCgyKSwgY29sb3VyID0gImJsYWNrIiksCiAgICBheGlzLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gInBsYWluIiksCiAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgbGVnZW5kLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpCiAgKQoKIyMjIyBFbnRyb3B5IENsYXNzaWZpY2F0aW9uICMgU3BsaXRzICMjIyMKcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkgJT4lCiAgZHBseXI6OmZpbHRlcihmaSA9PSAiTURJX3dpdGhfc3BsaXRzIikKCnRvdGFsX3NwbGl0cyA8LSByZXN1bHRzICU+JQogIGRwbHlyOjpncm91cF9ieShuX25hbWUsIGMsIHJlcCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShuX3NwbGl0cyA9IHN1bShhdl9zcGxpdHMpKQoKY2xhc3NpZmljYXRpb25fbnVtX3NwbGl0c19kZiA8LSByZXN1bHRzICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oCiAgICB0b3RhbF9zcGxpdHMsIGJ5ID0gYygibl9uYW1lIiwgImMiLCAicmVwIikKICApICU+JQogIGRwbHlyOjptdXRhdGUoCiAgICBhdl9zcGxpdHMgPSBhdl9zcGxpdHMgLyBuX3NwbGl0cyAqIDEwMAogICkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KG5fbmFtZSwgYywgdmFyKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKAogICAgLm1lYW4gPSBtZWFuKGF2X3NwbGl0cyksCiAgICAuc2QgPSBzZChhdl9zcGxpdHMpCiAgKQoKIyMjIyBTaG93IEF2ZyBSYW5rIFBsb3QgIyMjIwpjYXQoIlxuXG4jIyMgQXZlcmFnZSBSYW5rIFxuXG4iKQpwbHQgPC0gcGx0X3JlZ3Jlc3Npb24gKyBwbHRfY2xhc3NpZmljYXRpb24KaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICBnZ3Bsb3QyOjpnZ3NhdmUocGx0LCBmaWxlbmFtZSA9IGZpbGUucGF0aChmaWd1cmVzX2RpciwgImVudHJvcHlfc2ltcy5wZGYiKSwgCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gZmlnX3dpZHRoICogMS4yLCBoZWlnaHQgPSBmaWdfaGVpZ2h0ICogLjY1KQp9IGVsc2UgewogIHZ0aGVtZXM6OnN1YmNodW5raWZ5KAogICAgcGx0LCBpID0gY2h1bmtfaWR4LCBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCAqIC44LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMKICApCiAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKfQoKIyMjIyBTaG93ICMgU3BsaXRzIFBsb3QgIyMjIwpjYXQoIlxuXG4jIyMgTnVtYmVyIG9mIFJGIFNwbGl0cyBcblxuIikKcGx0X2RmIDwtIGRwbHlyOjpiaW5kX3Jvd3MoCiAgUmVncmVzc2lvbiA9IHJlZ3Jlc3Npb25fbnVtX3NwbGl0c19kZiwgCiAgQ2xhc3NpZmljYXRpb24gPSBjbGFzc2lmaWNhdGlvbl9udW1fc3BsaXRzX2RmLCAKICAuaWQgPSAidHlwZSIKKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgdmFyID0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgdmFyID09IDAgfiAiQmVybm91bGxpIChTaWduYWwpIiwKICAgICAgdmFyID09IDEgfiAiTm9ybWFsIChOb24tU2lnbmFsKSIsCiAgICAgIHZhciA9PSAyIH4gIjQtQ2F0ZWdvcmllcyAoTm9uLVNpZ25hbCkiLAogICAgICB2YXIgPT0gMyB+ICIxMC1DYXRlZ29yaWVzIChOb24tU2lnbmFsKSIsCiAgICAgIHZhciA9PSA0IH4gIjIwLUNhdGVnb3JpZXMgKE5vbi1TaWduYWwpIgogICAgKSAlPiUKICAgICAgZmFjdG9yKGxldmVscyA9IGMoIk5vcm1hbCAoTm9uLVNpZ25hbCkiLAogICAgICAgICAgICAgICAgICAgICAgICAiMjAtQ2F0ZWdvcmllcyAoTm9uLVNpZ25hbCkiLAogICAgICAgICAgICAgICAgICAgICAgICAiMTAtQ2F0ZWdvcmllcyAoTm9uLVNpZ25hbCkiLAogICAgICAgICAgICAgICAgICAgICAgICAiNC1DYXRlZ29yaWVzIChOb24tU2lnbmFsKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJCZXJub3VsbGkgKFNpZ25hbCkiKSkKICApCgpzaW1fdHlwZXMgPC0gdW5pcXVlKHBsdF9kZiR0eXBlKQpwbHRfbHMgPC0gbGlzdCgpCmZvciAoaWR4IGluIDE6bGVuZ3RoKHNpbV90eXBlcykpIHsKICBzaW1fdHlwZSA8LSBzaW1fdHlwZXNbaWR4XQogIHBsdCA8LSBwbHRfZGYgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKHR5cGUgPT0gISFzaW1fdHlwZSkgJT4lCiAgICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgICBnZ3Bsb3QyOjphZXMoeCA9IG5fbmFtZSwgeSA9IC5tZWFuLCBjb2xvciA9IGFzLmZhY3Rvcih2YXIpKSArCiAgICBnZ3Bsb3QyOjpnZW9tX2xpbmUoc2l6ZSA9IDEpICsKICAgIGdncGxvdDI6OmxhYnMoCiAgICAgIHggPSAiU2FtcGxlIFNpemUiLAogICAgICB5ID0gIlBlcmNlbnRhZ2Ugb2YgU3BsaXRzIGluIFJGICglKSIsCiAgICAgIGNvbG9yID0gIkZlYXR1cmUiLCAKICAgICAgdGl0bGUgPSBzaW1fdHlwZQogICAgKSArCiAgICBnZ3Bsb3QyOjpndWlkZXMoZmlsbCA9ICJub25lIiwgbGluZXR5cGUgPSAibm9uZSIpICsKICAgIHZ0aGVtZXM6OnRoZW1lX3Ztb2Rlcm4oCiAgICAgIHNpemVfcHJlc2V0ID0gIm1lZGl1bSIsIGJnX2NvbG9yID0gIndoaXRlIiwgZ3JpZF9jb2xvciA9ICJ3aGl0ZSIsCiAgICAgIGF4aXMudGlja3MgPSBnZ3Bsb3QyOjplbGVtZW50X2xpbmUoc2l6ZSA9IGdncGxvdDI6OnJlbCgyKSwgY29sb3VyID0gImJsYWNrIiksCiAgICAgIGF4aXMudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICBheGlzLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCwgZmFjZSA9ICJwbGFpbiIpLAogICAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICBsZWdlbmQudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgcGxvdC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KQogICAgKQogIGlmIChpZHggIT0gMSkgewogICAgcGx0IDwtIHBsdCArCiAgICAgIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICB9CiAgcGx0X2xzW1tpZHhdXSA8LSBwbHQKfQoKcGx0X3dpZGUgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgZ3VpZGVzID0gImNvbGxlY3QiLCBucm93ID0gMSkKaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICBnZ3Bsb3QyOjpnZ3NhdmUocGx0X3dpZGUsIGZpbGVuYW1lID0gZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAiZW50cm9weV9zaW1zX251bV9zcGxpdHMucGRmIiksCiAgICAgICAgICAgICAgICAgICMgaGVpZ2h0ID0gZmlnX2hlaWdodCAqIC41NSwgd2lkdGggPSBmaWdfd2lkdGggKiAuMjUgKiBsZW5ndGgoc2hvd19tZXRob2RzKSkKICAgICAgICAgICAgICAgICAgd2lkdGggPSBmaWdfd2lkdGggKiAxLjEsIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAuNjUpCn0gZWxzZSB7CiAgdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgICBwbHRfd2lkZSwgaSA9IGNodW5rX2lkeCwgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMwogICkKICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQp9CgpgYGAKCiMjIEFwcGVuZGl4IEZpZ3VyZXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQojIyMjIEVudHJvcHkgUmVncmVzc2lvbiBSZXN1bHRzICMjIyMKbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gcmV2KGMoImJsYWNrIiwgImJsYWNrIiwgIiM3MWJlYjciKSkKc2hvd19tZXRob2RzIDwtIHJldihjKCJHTURJIiwgIkdNRElfaW5iYWciLCAiTURJIikpCm1ldGhvZF9sYWJlbHMgPC0gcmV2KGMoIkdNREkgKHJpZGdlLCBMT08pIiwgIkdNREkgKHJpZGdlLCBpbi1iYWcpIiwgIk1ESSIpKQphbHBoYV92YWx1ZXMgPC0gcmV2KGMoMSwgMSwgcmVwKDEsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDIpKSkKbGluZXR5cGVfdmFsdWVzIDwtIGMoInNvbGlkIiwgImRhc2hlZCIsICJzb2xpZCIpCnlfbGltaXRzIDwtIGMoMSwgNSkKCm1ldHJpY19uYW1lIDwtICJBVVJPQyIKc2ltX25hbWUgPC0gImdtZGkubWRpX2JpYXNfc2ltcy5lbnRyb3B5X3NpbXMubGluZWFyX2RncCIKZm5hbWUgPC0gZmlsZS5wYXRoKAogIHJlc3VsdHNfZGlyLCAKICBzaW1fbmFtZSwKICAidmFyeWluZ19oZXJpdGFiaWxpdHlfbiIsCiAgc3ByaW50Zigic2VlZCVzIiwgc2VlZCksCiAgInJlc3VsdHMuY3N2IgopCgojIyMjIEVudHJvcHkgUmVncmVzc2lvbiBBdmcgUmFuayAjIyMjCnJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZm5hbWUpICU+JQogIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5X25hbWUgPT0gMC4xKQoKY3VzdG9tX2dyb3VwX2Z1biA8LSBmdW5jdGlvbih2YXIpIHZhcgoKcGx0X2Jhc2UgPC0gcGxvdF9wZXJ0dXJiYXRpb25fc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZmFjZXRfcm93cyA9ICJoZXJpdGFiaWxpdHlfbmFtZSIsCiAgZmFjZXRfY29scyA9ICJuX25hbWUiLCAKICBncm91cF9mdW4gPSBjdXN0b21fZ3JvdXBfZnVuLCAKICBwYXJhbV9uYW1lID0gTlVMTCwKICBwbG90X3R5cGVzID0gImVycmJhciIsCiAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMKKQoKcGx0X2RmIDwtIHBsdF9iYXNlJGFnZ1tbMV1dJGRhdGEKbnJlcHMgPC0gbGVuZ3RoKHVuaXF1ZShyZXN1bHRzJHJlcCkpCgpwbHRfcmVncmVzc2lvbiA8LSBwbHRfZGYgJT4lCiAgZHBseXI6OmZpbHRlcihncm91cCA9PSAwKSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuX25hbWUsIHkgPSAubWVhbiwgY29sb3IgPSBmaSwgYWxwaGEgPSBmaSwgbGluZXR5cGUgPSBmaSkgKwogIGdncGxvdDI6Omdlb21fbGluZShzaXplID0gbGluZV9zaXplKSArCiAgZ2dwbG90Mjo6bGFicygKICAgIHggPSAiU2FtcGxlIFNpemUiLCAKICAgIHkgPSBleHByZXNzaW9uKCJBdmVyYWdlIFJhbmsgb2YgIipYWzFdKSwgCiAgICBjb2xvciA9ICJNZXRob2QiLAogICAgbGluZXR5cGUgPSAiTWV0aG9kIiwKICAgIHRpdGxlID0gIlJlZ3Jlc3Npb24iCiAgKSArCiAgZ2dwbG90Mjo6Z3VpZGVzKGZpbGwgPSAibm9uZSIsIGFscGhhID0gIm5vbmUiKSArCiAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBnZ3Bsb3QyOjpzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYWxwaGFfdmFsdWVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBnZ3Bsb3QyOjpndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpKSArCiAgZ2dwbG90Mjo6c2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGxpbmV0eXBlX3ZhbHVlcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIGdncGxvdDI6OmNvb3JkX2NhcnRlc2lhbih5bGltID0geV9saW1pdHMpICsKICB2dGhlbWVzOjp0aGVtZV92bW9kZXJuKAogICAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICAgIGF4aXMudGlja3MgPSBnZ3Bsb3QyOjplbGVtZW50X2xpbmUoc2l6ZSA9IGdncGxvdDI6OnJlbCgyKSwgY29sb3VyID0gImJsYWNrIiksCiAgICBheGlzLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gInBsYWluIiksCiAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgbGVnZW5kLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpLAogICAgbGVnZW5kLmtleS53aWR0aCA9IGdncGxvdDI6OnVuaXQoMSwgImNtIikKICApCgojIyMjIEVudHJvcHkgQ2xhc3NpZmljYXRpb24gUmVzdWx0cyAjIyMjCm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIHJldihjKCJibGFjayIsICJibGFjayIsICIjOUI1REZGIiwgIiM5QjVERkYiLCAiIzcxYmViNyIpKQpzaG93X21ldGhvZHMgPC0gcmV2KGMoIkdNRElfcmlkZ2UiLCAiR01ESV9yaWRnZV9pbmJhZyIsICJHTURJX2xvZ2lzdGljX2xvZ2xvc3MiLCAiR01ESV9sb2dpc3RpY19sb2dsb3NzX2luYmFnIiwgIk1ESSIpKQptZXRob2RfbGFiZWxzIDwtIHJldihjKCJHTURJIChyaWRnZSwgTE9PKSIsICJHTURJIChyaWRnZSwgaW4tYmFnKSIsICJHTURJIChsb2dpc3RpYywgTE9PKSIsICJHTURJIChsb2dpc3RpYywgaW4tYmFnKSIsICJNREkiKSkKYWxwaGFfdmFsdWVzIDwtIHJldihjKDEsIDEsIDEsIDEsIHJlcCgxLCBsZW5ndGgobWV0aG9kX2xhYmVscykgLSA0KSkpCmxpbmV0eXBlX3ZhbHVlcyA8LSBjKCJzb2xpZCIsICJkYXNoZWQiLCAic29saWQiLCAiZGFzaGVkIiwgInNvbGlkIikKCm1ldHJpY19uYW1lIDwtICJBVVJPQyIKc2ltX25hbWUgPC0gImdtZGkubWRpX2JpYXNfc2ltcy5lbnRyb3B5X3NpbXMubG9naXN0aWNfZGdwIgpmbmFtZSA8LSBmaWxlLnBhdGgoCiAgcmVzdWx0c19kaXIsIAogIHNpbV9uYW1lLAogICJ2YXJ5aW5nX2NfbiIsCiAgc3ByaW50Zigic2VlZCVzIiwgc2VlZCksCiAgInJlc3VsdHMuY3N2IgopCgojIyMjIEVudHJvcHkgQ2xhc3NpZmljYXRpb24gQXZnIFJhbmsgIyMjIwpyZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKGZuYW1lKQoKY3VzdG9tX2dyb3VwX2Z1biA8LSBmdW5jdGlvbih2YXIpIHZhcgoKcGx0X2Jhc2UgPC0gcGxvdF9wZXJ0dXJiYXRpb25fc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZmFjZXRfcm93cyA9ICJjX25hbWUiLAogIGZhY2V0X2NvbHMgPSAibl9uYW1lIiwgCiAgZ3JvdXBfZnVuID0gY3VzdG9tX2dyb3VwX2Z1biwgCiAgZGVzY2VuZGluZ19tZXRob2RzID0gYygiR01ESSAobG9naXN0aWMsIExPTykiLCAiR01ESSAobG9naXN0aWMsIGluLWJhZykiKSwKICBwYXJhbV9uYW1lID0gTlVMTCwKICBwbG90X3R5cGVzID0gImVycmJhciIsCiAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMKKQoKcGx0X2RmIDwtIHBsdF9iYXNlJGFnZ1tbMV1dJGRhdGEKbnJlcHMgPC0gbGVuZ3RoKHVuaXF1ZShyZXN1bHRzJHJlcCkpCgpwbHRfY2xhc3NpZmljYXRpb24gPC0gcGx0X2RmICU+JQogIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMCkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gbl9uYW1lLCB5ID0gLm1lYW4sIGNvbG9yID0gZmksIGFscGhhID0gZmksIGxpbmV0eXBlID0gZmkpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoc2l6ZSA9IGxpbmVfc2l6ZSkgKwogIGdncGxvdDI6OmxhYnMoCiAgICB4ID0gIlNhbXBsZSBTaXplIiwgCiAgICB5ID0gZXhwcmVzc2lvbigiQXZlcmFnZSBSYW5rIG9mICIqWFsxXSksIAogICAgY29sb3IgPSAiTWV0aG9kIiwKICAgIGxpbmV0eXBlID0gIk1ldGhvZCIsCiAgICB0aXRsZSA9ICJDbGFzc2lmaWNhdGlvbiIKICApICsKICBnZ3Bsb3QyOjpndWlkZXMoZmlsbCA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIGdncGxvdDI6OnNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBhbHBoYV92YWx1ZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBnZ3Bsb3QyOjpzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gbGluZXR5cGVfdmFsdWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBnZ3Bsb3QyOjpjb29yZF9jYXJ0ZXNpYW4oCiAgICB5bGltID0geV9saW1pdHMKICApICsKICB2dGhlbWVzOjp0aGVtZV92bW9kZXJuKAogICAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICAgIGF4aXMudGlja3MgPSBnZ3Bsb3QyOjplbGVtZW50X2xpbmUoc2l6ZSA9IGdncGxvdDI6OnJlbCgyKSwgY29sb3VyID0gImJsYWNrIiksCiAgICBheGlzLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gInBsYWluIiksCiAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgbGVnZW5kLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpLAogICAgbGVnZW5kLmtleS53aWR0aCA9IGdncGxvdDI6OnVuaXQoMSwgImNtIikKICApCgojIyMjIFNob3cgQXZnIFJhbmsgUGxvdCAjIyMjCmNhdCgiXG5cbiMjIyBBdmVyYWdlIFJhbmsgXG5cbiIpCnBsdCA8LSBwbHRfcmVncmVzc2lvbiArIHBsdF9jbGFzc2lmaWNhdGlvbgppZiAocGFyYW1zJGZvcl9wYXBlcikgewogIGdncGxvdDI6Omdnc2F2ZShwbHQsIGZpbGVuYW1lID0gZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAiYXBwZW5kaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnRyb3B5X3NpbXNfYXBwZW5kaXgucGRmIiksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IGZpZ193aWR0aCAqIDEuMzUsIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAuNjUpCn0gZWxzZSB7CiAgdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgICBwbHQsIGkgPSBjaHVua19pZHgsIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0ICogLjcsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMwogICkKICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQp9CgpgYGAKCgojIENDTEUgQ2FzZSBTdHVkeSB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9Cm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGMoImJsYWNrIiwgIm9yYW5nZSIsICIjNzFiZWI3IiwgIiMyMThhMWUiLCAiI2NjMzM5OSIpCnNob3dfbWV0aG9kcyA8LSBjKCJHTURJIiwgIk1EQSIsICJNREkiLCAiTURJLW9vYiIsICJUcmVlU0hBUCIpCm1ldGhvZF9sYWJlbHMgPC0gYygiR01ESSAocmlkZ2UpIiwgIk1EQSIsICJNREkiLCAiTURJLW9vYiIsICJUcmVlU0hBUCIpCgpmcGF0aCA8LSAiZ21kaS5yZWFsX2RhdGFfY2FzZV9zdHVkeS5jY2xlX3JuYXNlcV9yZWdyZXNzaW9uLSIKZm5hbWUgPC0gZmlsZS5wYXRoKAogIHJlc3VsdHNfZGlyLCAKICBmcGF0aCwKICBzcHJpbnRmKCJzZWVkJXMiLCBzZWVkKSwKICAicmVzdWx0cy5jc3YiCikKWCA8LSBkYXRhLnRhYmxlOjpmcmVhZCgiL2dsb2JhbC9zY3JhdGNoL3VzZXJzL3RpZmZhbnl0YW5nL2ZlYXR1cmVfaW1wb3J0YW5jZS9kYXRhL1hfY2NsZV9ybmFzZXFfbG9nX3RyYW5zZm9ybWVkX2ZpbHRlcmVkNTAwMC5jc3YiKQpYX2NvbHVtbnMgPC0gY29sbmFtZXMoWCkKcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkKCm91dCA8LSBwbG90X3RvcF9zdGFiaWxpdHkoCiAgcmVzdWx0cywKICBncm91cF9pZCA9ICJ5X3Rhc2siLAogIHRvcF9yID0gMTAsCiAgc2hvd19tYXhfZmVhdHVyZXMgPSA1LAogIHZhcm5hbWVzID0gY29sbmFtZXMoWCksCiAgYmFzZV9tZXRob2QgPSAiR01ESSAocmlkZ2UpIiwKICByZXR1cm5fZGYgPSBUUlVFLAogIGRlc2NlbmRpbmdfbWV0aG9kcyA9IE5VTEwsCiAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSByZXYobWFudWFsX2NvbG9yX3BhbGV0dGUpLAogIHNob3dfbWV0aG9kcyA9IHJldihzaG93X21ldGhvZHMpLAogIG1ldGhvZF9sYWJlbHMgPSByZXYobWV0aG9kX2xhYmVscykKKQoKcmFua2luZ19kZiA8LSBvdXQkcmFua2luZ3MKc3RhYmlsaXR5X2RmIDwtIG91dCRzdGFiaWxpdHkKcGx0X2xzIDwtIG91dCRwbG90X2xzCgojIGdldCBnZW5lIG5hbWVzIGluc3RlYWQgb2YgRU5TRyBpZHMKbGlicmFyeShiaW9tYVJ0KQplbnNlbWJsIDwtIHVzZU1hcnQoImVuc2VtYmwiLCBkYXRhc2V0ID0gImhzYXBpZW5zX2dlbmVfZW5zZW1ibCIpCnZhcm5hbWVzIDwtIGdldEJNKAogIGF0dHJpYnV0ZXMgPSBjKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiKSwgCiAgZmlsdGVycyA9ICJlbnNlbWJsX2dlbmVfaWQiLCAKICB2YWx1ZXMgPSBzdHJpbmdyOjpzdHJfcmVtb3ZlKGNvbG5hbWVzKFgpLCAiXFwuW15cXC5dKyQiKSwgCiAgbWFydCA9IGVuc2VtYmwKKSAlPiUKICBkcGx5cjo6ZmlsdGVyKGhnbmNfc3ltYm9sICE9ICIiKSAlPiUKICBkcGx5cjo6YmluZF9yb3dzKAogICAgZGF0YS5mcmFtZShlbnNlbWJsX2dlbmVfaWQgPSBzdHJpbmdyOjpzdHJfcmVtb3ZlKGNvbG5hbWVzKFgpLCAiXFwuW15cXC5dKyQiKSwKICAgICAgICAgICAgICAgaGduY19zeW1ib2wgPSBzdHJpbmdyOjpzdHJfcmVtb3ZlKGNvbG5hbWVzKFgpLCAiXFwuW15cXC5dKyQiKSkKICApICU+JQogIGRwbHlyOjpkaXN0aW5jdChlbnNlbWJsX2dlbmVfaWQsIC5rZWVwX2FsbCA9IFRSVUUpCgojIGdldCB0b3AgNSBnZW5lcwp0b3BfZ2VuZXMgPC0gcmFua2luZ19kZiAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoeV90YXNrLCBmaSwgdmFyKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKG1lYW5fcmFuayA9IG1lYW4ocmFuaykpICU+JQogIGRwbHlyOjp1bmdyb3VwKCkgJT4lCiAgZHBseXI6OmFycmFuZ2UoeV90YXNrLCBtZWFuX3JhbmspICU+JQogIGRwbHlyOjpncm91cF9ieSh5X3Rhc2ssIGZpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHJhbmsgPSAxOmRwbHlyOjpuKCkpICU+JQogIGRwbHlyOjp1bmdyb3VwKCkKCnRvcF9nZW5lc190YWJsZSA8LSB0b3BfZ2VuZXMgJT4lCiAgZHBseXI6OmZpbHRlcihyYW5rIDw9IDUpICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oCiAgICB5ID0gZGF0YS5mcmFtZSh2YXIgPSAwOihuY29sKFgpIC0gMSksIAogICAgICAgICAgICAgICAgICAgZW5zZW1ibF9nZW5lX2lkID0gc3RyaW5ncjo6c3RyX3JlbW92ZShjb2xuYW1lcyhYKSwgIlxcLlteXFwuXSskIikpLAogICAgYnkgPSAidmFyIgogICkgJT4lCiAgZHBseXI6OmxlZnRfam9pbigKICAgIHkgPSB2YXJuYW1lcywgYnkgPSAiZW5zZW1ibF9nZW5lX2lkIgogICkgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIHZhbHVlID0gc3ByaW50ZigiJXMgKCVzKSIsIGhnbmNfc3ltYm9sLCByb3VuZChtZWFuX3JhbmssIDIpKQogICkgJT4lCiAgdGlkeXI6OnBpdm90X3dpZGVyKAogICAgaWRfY29scyA9IGMoeV90YXNrLCByYW5rKSwgCiAgICBuYW1lc19mcm9tID0gZmksIAogICAgdmFsdWVzX2Zyb20gPSB2YWx1ZQogICkgJT4lCiAgZHBseXI6OnJlbmFtZSgKICAgICJEcnVnIiA9ICJ5X3Rhc2siLAogICAgIlJhbmsiID0gInJhbmsiCiAgKQoKIyB3cml0ZS5jc3YoCiMgICB0b3BfZ2VuZXNfdGFibGUsIGZpbGUucGF0aCh0YWJsZXNfZGlyLCAiY2NsZV9ybmFzZXFfdG9wX2dlbmVzX3RhYmxlLmNzdiIpLAojICAgcm93Lm5hbWVzID0gRkFMU0UsIHF1b3RlID0gRkFMU0UKIyApCgojIGdldCAjIGdlbmVzIHdpdGggcGVyZmVjdCBzdGFiaWxpdHkKc3RhYmxlX2dlbmVzX2thYmxlIDwtIHN0YWJpbGl0eV9kZiAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoZmksIHlfdGFzaykgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShzdGFiaWxpdHlfMSA9IHN1bShzdGFiaWxpdHlfc2NvcmUgPT0gMSkpICU+JQogIHRpZHlyOjpwaXZvdF93aWRlcihpZF9jb2xzID0gZmksIG5hbWVzX2Zyb20gPSB5X3Rhc2ssIHZhbHVlc19mcm9tID0gc3RhYmlsaXR5XzEpICU+JQogIGRwbHlyOjp1bmdyb3VwKCkgJT4lCiAgYXMuZGF0YS5mcmFtZSgpCgpmb3IgKHBsdF9pZCBpbiBuYW1lcyhwbHRfbHMpKSB7CiAgY2F0KHNwcmludGYoIlxuXG4jIyAlcyBcblxuIiwgcGx0X2lkKSkKICBwbHQgPC0gcGx0X2xzW1twbHRfaWRdXQogIGlmIChwbHRfaWQgPT0gIlN1bW1hcnkiKSB7CiAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6bGFicyh5ID0gIkRydWciKQogICAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgICAgZ2dwbG90Mjo6Z2dzYXZlKHBsdCwgZmlsZW5hbWUgPSBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJjY2xlX3JuYXNlcV9zdGFiaWxpdHlfdG9wMTAucGRmIiksIAogICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBmaWdfd2lkdGggKiAxLjUsIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAxLjEpCiAgICB9IGVsc2UgewogICAgICB2dGhlbWVzOjpzdWJjaHVua2lmeSgKICAgICAgICBwbHQsIGkgPSBzcHJpbnRmKCIlcy0lcyIsIGZwYXRoLCBwbHRfaWQpLCAKICAgICAgICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zCiAgICAgICkKICAgIH0KICAgIAogICAgY2F0KCJcblxuIyMgVGFibGUgb2YgVG9wIEdlbmVzIFxuXG4iKQogICAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgICAgdG9wX2dlbmVzX2thYmxlIDwtIHRvcF9nZW5lc190YWJsZSAlPiUKICAgICAgICBkcGx5cjo6ZmlsdGVyKFJhbmsgPD0gNSkgJT4lCiAgICAgICAgZHBseXI6OnNlbGVjdCgtRHJ1ZykgJT4lCiAgICAgICAgZHBseXI6OnJlbmFtZSgiICIgPSAiUmFuayIpICU+JQogICAgICAgIHZ0aGVtZXM6OnByZXR0eV9rYWJsZShmb3JtYXQgPSAibGF0ZXgiLCBsb25ndGFibGUgPSBUUlVFKSAlPiUKICAgICAgICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGxhdGV4X29wdGlvbnMgPSAicmVwZWF0X2hlYWRlciIpICU+JQogICAgICAgICMga2FibGVFeHRyYTo6Y29sbGFwc2Vfcm93cyhjb2x1bW5zID0gMSwgdmFsaWduID0gIm1pZGRsZSIpCiAgICAgICAga2FibGVFeHRyYTo6cGFja19yb3dzKAogICAgICAgICAgaW5kZXggPSByZXAoNSwgMjQpICU+JSBzZXROYW1lcyh1bmlxdWUodG9wX2dlbmVzX3RhYmxlJERydWcpKQogICAgICAgICkKICAgIH0gZWxzZSB7CiAgICAgIHRvcF9nZW5lc19rYWJsZSA8LSB0b3BfZ2VuZXNfdGFibGUgJT4lCiAgICAgICAgZHBseXI6OmZpbHRlcihSYW5rIDw9IDUpICU+JQogICAgICAgIGRwbHlyOjpzZWxlY3QoLURydWcpICU+JQogICAgICAgIGRwbHlyOjpyZW5hbWUoIiAiID0gIlJhbmsiKSAlPiUKICAgICAgICB2dGhlbWVzOjpwcmV0dHlfa2FibGUoKSAlPiUKICAgICAgICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGxhdGV4X29wdGlvbnMgPSAicmVwZWF0X2hlYWRlciIpICU+JQogICAgICAgICMga2FibGVFeHRyYTo6Y29sbGFwc2Vfcm93cyhjb2x1bW5zID0gMSwgdmFsaWduID0gIm1pZGRsZSIpCiAgICAgICAga2FibGVFeHRyYTo6cGFja19yb3dzKAogICAgICAgICAgaW5kZXggPSByZXAoNSwgMjQpICU+JSBzZXROYW1lcyh1bmlxdWUodG9wX2dlbmVzX3RhYmxlJERydWcpKQogICAgICAgICkKICAgICAgdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgICAgICAgdG9wX2dlbmVzX2thYmxlLCBpID0gc3ByaW50ZigiJXMtdGFibGUiLCBmcGF0aCkKICAgICAgKQogICAgfQogIH0gZWxzZSBpZiAoIXBhcmFtcyRmb3JfcGFwZXIpIHsKICAgIHZ0aGVtZXM6OnN1YmNodW5raWZ5KAogICAgICBwbG90X2Z1bihwbHQpLCBpID0gc3ByaW50ZigiJXMtJXMiLCBmcGF0aCwgcGx0X2lkKSwgCiAgICAgIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMKICAgICkKICB9Cn0KYGBgCgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0KaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICBtYW51YWxfY29sb3JfcGFsZXR0ZV9mdWxsIDwtIGMoImJsYWNrIiwgIm9yYW5nZSIsICIjNzFiZWI3IiwgIiMyMThhMWUiLCAiI2NjMzM5OSIpCiAgc2hvd19tZXRob2RzX2Z1bGwgPC0gYygiR01ESSIsICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiKQogIG1ldGhvZF9sYWJlbHNfZnVsbCA8LSBjKCJHTURJIChyaWRnZSkiLCAiTURBIiwgIk1ESSIsICJNREktb29iIiwgIlRyZWVTSEFQIikKICBrZWVwX21ldGhvZHNfbGlzdCA8LSBsaXN0KAogICAgYWxsID0gYygiR01ESSIsICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiKSwKICAgIG5vX21kaW9vYiA9IGMoIkdNREkiLCAiTURBIiwgIk1ESSIsICJUcmVlU0hBUCIpLAogICAgem9vbSA9IGMoIkdNREkiLCAiTURJIiwgIlRyZWVTSEFQIikKICApCiAgCiAgZnBhdGggPC0gImdtZGkucmVhbF9kYXRhX2Nhc2Vfc3R1ZHkuY2NsZV9ybmFzZXFfcmVncmVzc2lvbi0iCiAgZm5hbWUgPC0gZmlsZS5wYXRoKAogICAgcmVzdWx0c19kaXIsIAogICAgZnBhdGgsCiAgICBzcHJpbnRmKCJzZWVkJXMiLCBzZWVkKSwKICAgICJyZXN1bHRzLmNzdiIKICApCiAgWCA8LSBkYXRhLnRhYmxlOjpmcmVhZCgiL2dsb2JhbC9zY3JhdGNoL3VzZXJzL3RpZmZhbnl0YW5nL2ZlYXR1cmVfaW1wb3J0YW5jZS9kYXRhL1hfY2NsZV9ybmFzZXFfbG9nX3RyYW5zZm9ybWVkX2ZpbHRlcmVkNTAwMC5jc3YiKQogIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZm5hbWUpCiAgCiAgZm9yIChpZCBpbiBuYW1lcyhrZWVwX21ldGhvZHNfbGlzdCkpIHsKICAgIGtlZXBfbWV0aG9kcyA8LSBrZWVwX21ldGhvZHNfbGlzdFtbaWRdXQogICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gbWFudWFsX2NvbG9yX3BhbGV0dGVfZnVsbFtzaG93X21ldGhvZHNfZnVsbCAlaW4lIGtlZXBfbWV0aG9kc10KICAgIHNob3dfbWV0aG9kcyA8LSBzaG93X21ldGhvZHNfZnVsbFtzaG93X21ldGhvZHNfZnVsbCAlaW4lIGtlZXBfbWV0aG9kc10KICAgIG1ldGhvZF9sYWJlbHMgPC0gbWV0aG9kX2xhYmVsc19mdWxsW3Nob3dfbWV0aG9kc19mdWxsICVpbiUga2VlcF9tZXRob2RzXQogICAgCiAgICBwbHRfbHMgPC0gcGxvdF90b3Bfc3RhYmlsaXR5KAogICAgICByZXN1bHRzLAogICAgICBncm91cF9pZCA9ICJ5X3Rhc2siLAogICAgICB0b3BfciA9IDEwLAogICAgICBzaG93X21heF9mZWF0dXJlcyA9IDUsCiAgICAgIHZhcm5hbWVzID0gY29sbmFtZXMoWCksCiAgICAgIGJhc2VfbWV0aG9kID0gIkdNREkiLAogICAgICByZXR1cm5fZGYgPSBGQUxTRSwKICAgICAgZGVzY2VuZGluZ19tZXRob2RzID0gTlVMTCwKICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscwogICAgKQogICAgCiAgICBpZiAoaWQgPT0gIm5vX21kaW9vYiIpIHsKICAgICAga2VlcF9kcnVncyA8LSBjKCJQYW5vYmlub3N0YXQiLCAiTGFwYXRpbmliIiwgIlRBRTY4NCIsICJMLTY4NTQ1OCIpCiAgICAgIHNtYWxsX3BsdF9scyA8LSBsaXN0KCkKICAgICAgZm9yIChkcnVnIGluIGtlZXBfZHJ1Z3MpIHsKICAgICAgICBwbHQgPC0gcGx0X2xzW1tkcnVnXV0KICAgICAgICBpZiAoZHJ1ZyAhPSBrZWVwX2RydWdzWzFdKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgIH0KICAgICAgICBzbWFsbF9wbHRfbHNbW2RydWddXSA8LSBwbHQKICAgICAgfQogICAgICBzbWFsbF9wbHRfbHNbWzFdXSArIHNtYWxsX3BsdF9sc1tbMl1dICsgc21hbGxfcGx0X2xzW1szXV0gKyBzbWFsbF9wbHRfbHNbWzRdXSArCiAgICAgICAgcGF0Y2h3b3JrOjpwbG90X2xheW91dChucm93ID0gMSwgbmNvbCA9IDQsIGd1aWRlcyA9ICJjb2xsZWN0IikKICAgICAgcGx0IDwtIHBhdGNod29yazo6d3JhcF9wbG90cyhzbWFsbF9wbHRfbHMsIG5yb3cgPSAxLCBuY29sID0gNCwgZ3VpZGVzID0gImNvbGxlY3QiKSAmCiAgICAgICAgZ2dwbG90Mjo6dGhlbWUoCiAgICAgICAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBnZ3Bsb3QyOjplbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpLAogICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGdncGxvdDI6OmVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5OTUiLCBzaXplID0gZ2dwbG90Mjo6cmVsKDAuMjUpKQogICAgICAgICkKICAgICAgZ2dwbG90Mjo6Z2dzYXZlKHBsdCwgZmlsZW5hbWUgPSBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJjY2xlX3JuYXNlcV9zdGFiaWxpdHlfc2VsZWN0X2ZlYXR1cmVzLnBkZiIpLAogICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBmaWdfd2lkdGggKiAxLCBoZWlnaHQgPSBmaWdfaGVpZ2h0ICogMC41KQogICAgfSBlbHNlIHsKICAgICAgYWxsX3BsdF9scyA8LSBsaXN0KCkKICAgICAgZm9yIChpZHggaW4gMTpsZW5ndGgodW5pcXVlKHJlc3VsdHMkeV90YXNrKSkpIHsKICAgICAgICBkcnVnIDwtIHNvcnQodW5pcXVlKHJlc3VsdHMkeV90YXNrKSlbaWR4XQogICAgICAgIHBsdCA8LSBwbHRfbHNbW2RydWddXQogICAgICAgIGlmICgoaWR4IC0gMSkgJSUgNCAhPSAwKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgIH0KICAgICAgICBpZiAoKGlkeCAtIDEpICUvJSA0ICE9IDUpIHsKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgfQogICAgICAgIGFsbF9wbHRfbHNbW2RydWddXSA8LSBwbHQKICAgICAgfQogICAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKGFsbF9wbHRfbHMsIGd1aWRlcyA9ICJjb2xsZWN0IiwgbmNvbCA9IDQsIG5yb3cgPSA2KSAmCiAgICAgICAgZ2dwbG90Mjo6dGhlbWUoCiAgICAgICAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBnZ3Bsb3QyOjplbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpLAogICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGdncGxvdDI6OmVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5OTUiLCBzaXplID0gZ2dwbG90Mjo6cmVsKDAuMjUpKQogICAgICAgICkKICAgICAgZ2dwbG90Mjo6Z2dzYXZlKHBsdCwgCiAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGUucGF0aChmaWd1cmVzX2RpciwgImFwcGVuZGl4Iiwgc3ByaW50ZigiY2NsZV9ybmFzZXFfc3RhYmlsaXR5X3NlbGVjdF9mZWF0dXJlc18lcy5wZGYiLCBpZCkpLAogICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBmaWdfd2lkdGggKiAxLCBoZWlnaHQgPSBmaWdfaGVpZ2h0ICogMikKICAgIH0KICB9Cn0KCmBgYAoKCiMgVENHQSBCUkNBIENhc2UgU3R1ZHkgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSBjKCJibGFjayIsICIjOUI1REZGIiwgIm9yYW5nZSIsICIjNzFiZWI3IiwgIiNjYzMzOTkiKQpzaG93X21ldGhvZHMgPC0gYygiR01ESV9yaWRnZSIsICJHTURJX2xvZ2lzdGljX2xvZ2xvc3MiLCAiTURBIiwgIk1ESSIsICJUcmVlU0hBUCIpCm1ldGhvZF9sYWJlbHMgPC0gYygiR01ESSAocmlkZ2UpIiwgIkdNREkgKGxvZ2lzdGljKSIsICJNREEiLCAiTURJIiwgIlRyZWVTSEFQIikKCmZwYXRoIDwtICJnbWRpLnJlYWxfZGF0YV9jYXNlX3N0dWR5LnRjZ2FfYnJjYV9jbGFzc2lmaWNhdGlvbi0iCmZuYW1lIDwtIGZpbGUucGF0aCgKICByZXN1bHRzX2RpciwgCiAgZnBhdGgsCiAgc3ByaW50Zigic2VlZCVzIiwgc2VlZCksCiAgInJlc3VsdHMuY3N2IgopClggPC0gZGF0YS50YWJsZTo6ZnJlYWQoIi9nbG9iYWwvc2NyYXRjaC91c2Vycy90aWZmYW55dGFuZy9mZWF0dXJlX2ltcG9ydGFuY2UvZGF0YS9YX3RjZ2FfdmFyX2ZpbHRlcmVkX2xvZ190cmFuc2Zvcm1lZC5jc3YiKQpyZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKGZuYW1lKQpvdXQgPC0gcGxvdF90b3Bfc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZ3JvdXBfaWQgPSBOVUxMLAogIHRvcF9yID0gMTAsCiAgc2hvd19tYXhfZmVhdHVyZXMgPSAyMCwKICB2YXJuYW1lcyA9IGNvbG5hbWVzKFgpLAogIGJhc2VfbWV0aG9kID0gIkdNREkgKHJpZGdlKSIsIAogIHJldHVybl9kZiA9IFRSVUUsCiAgZGVzY2VuZGluZ19tZXRob2RzID0gIkdNREkgKGxvZ2lzdGljKSIsCiAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMKKQoKcmFua2luZ19kZiA8LSBvdXQkcmFua2luZ3MKc3RhYmlsaXR5X2RmIDwtIG91dCRzdGFiaWxpdHkKcGx0X2xzIDwtIG91dCRwbG90X2xzCgpjYXQoIlxuXG4jIyBOb24temVybyBTdGFiaWxpdHkgU2NvcmVzIFBlciBNZXRob2RcblxuIikKdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgcGx0X2xzW1sxXV0sIGkgPSBzcHJpbnRmKCIlcy0lcyIsIGZwYXRoLCAxKSwgCiAgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQgKiByb3VuZChsZW5ndGgodW5pcXVlKHJlc3VsdHMkZmkpKSAvIDIpLCBmaWdfd2lkdGggPSBmaWdfd2lkdGgKKQoKY2F0KCJcblxuIyMgU3RhYmlsaXR5IG9mIFRvcCBGZWF0dXJlc1xuXG4iKQp2dGhlbWVzOjpzdWJjaHVua2lmeSgKICBwbG90X2Z1bihwbHRfbHNbWzJdXSksIGkgPSBzcHJpbnRmKCIlcy0lcyIsIGZwYXRoLCAyKSwgCiAgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQsIGZpZ193aWR0aCA9IGZpZ193aWR0aAopCgojIGdldCB0b3AgMTAgZ2VuZXMKdG9wX2dlbmVzIDwtIHJhbmtpbmdfZGYgJT4lCiAgZHBseXI6Omdyb3VwX2J5KGZpLCB2YXIpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UobWVhbl9yYW5rID0gbWVhbihyYW5rKSkgJT4lCiAgZHBseXI6OnVuZ3JvdXAoKSAlPiUKICBkcGx5cjo6YXJyYW5nZShtZWFuX3JhbmspICU+JQogIGRwbHlyOjpncm91cF9ieShmaSkgJT4lCiAgZHBseXI6Om11dGF0ZShyYW5rID0gMTpkcGx5cjo6bigpKSAlPiUKICBkcGx5cjo6dW5ncm91cCgpCgp0b3BfZ2VuZXNfdGFibGUgPC0gdG9wX2dlbmVzICU+JQogIGRwbHlyOjpmaWx0ZXIocmFuayA8PSAxMCkgJT4lCiAgZHBseXI6OmxlZnRfam9pbigKICAgIHkgPSBkYXRhLmZyYW1lKHZhciA9IDA6KG5jb2woWCkgLSAxKSwgCiAgICAgICAgICAgICAgICAgICBnZW5lID0gY29sbmFtZXMoWCkpLAogICAgYnkgPSAidmFyIgogICkgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIHZhbHVlID0gc3ByaW50ZigiJXMgKCVzKSIsIGdlbmUsIHJvdW5kKG1lYW5fcmFuaywgMikpCiAgKSAlPiUKICB0aWR5cjo6cGl2b3Rfd2lkZXIoCiAgICBpZF9jb2xzID0gcmFuaywgCiAgICBuYW1lc19mcm9tID0gZmksIAogICAgdmFsdWVzX2Zyb20gPSB2YWx1ZQogICkgJT4lCiAgZHBseXI6OnJlbmFtZSgKICAgICJSYW5rIiA9ICJyYW5rIgogICkKCiMgd3JpdGUuY3N2KAojICAgdG9wX2dlbmVzX3RhYmxlLCBmaWxlLnBhdGgodGFibGVzX2RpciwgInRjZ2FfdG9wX2dlbmVzX3RhYmxlLmNzdiIpLAojICAgcm93Lm5hbWVzID0gRkFMU0UsIHF1b3RlID0gRkFMU0UKIyApCgpjYXQoIlxuXG4jIyBUYWJsZSBvZiBUb3AgR2VuZXMgXG5cbiIpCmlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgdG9wX2dlbmVzX2thYmxlIDwtIHRvcF9nZW5lc190YWJsZSAlPiUKICAgIHZ0aGVtZXM6OnByZXR0eV9rYWJsZShmb3JtYXQgPSAibGF0ZXgiLCBsb25ndGFibGUgPSBUUlVFKSAlPiUKICAgIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcobGF0ZXhfb3B0aW9ucyA9ICJyZXBlYXRfaGVhZGVyIikKfSBlbHNlIHsKICB0b3BfZ2VuZXNfa2FibGUgPC0gdG9wX2dlbmVzX3RhYmxlICU+JQogICAgdnRoZW1lczo6cHJldHR5X2thYmxlKCkgJT4lCiAgICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGxhdGV4X29wdGlvbnMgPSAicmVwZWF0X2hlYWRlciIpCiAgdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgICB0b3BfZ2VuZXNfa2FibGUsIGkgPSBzcHJpbnRmKCIlcy10YWJsZSIsIGZwYXRoKQogICkKfQpgYGAKCgojIE1pc3NwZWNpZmllZCBNb2RlbHMgey50YWJzZXQgLnRhYnNldC12bW9kZXJufQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9CmtlZXBfbWV0aG9kcyA8LSBjb2xvcl9kZiRuYW1lICVpbiUgYygiR01ESV9yaWRnZV9SRiIsICJNREFfUkYiLCAiTURJX1JGIiwgIk1ESS1vb2JfUkYiLCAiVHJlZVNIQVBfUkYiKQptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSBjb2xvcl9kZiRjb2xvcltrZWVwX21ldGhvZHNdCnNob3dfbWV0aG9kcyA8LSBjb2xvcl9kZiRuYW1lW2tlZXBfbWV0aG9kc10KbWV0aG9kX2xhYmVscyA8LSBjb2xvcl9kZiRsYWJlbFtrZWVwX21ldGhvZHNdCmFscGhhX3ZhbHVlcyA8LSBjKDEsIHJlcCgwLjQsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDEpKQpsZWdlbmRfcG9zaXRpb24gPC0gYygwLjczLCAwLjM1KQoKdmFyeV9wYXJhbV9uYW1lIDwtICJoZXJpdGFiaWxpdHlfc2FtcGxlX3Jvd19uIgp5X21vZGVscyA8LSBjKCJsaW5lYXIiLCAibHNzXzNtXzJyIiwgImhpZXJfcG9seV8zbV8yciIsICJsaW5lYXJfbHNzXzNtXzJyIikKeF9tb2RlbHMgPC0gYygiZW5oYW5jZXIiLCAiY2NsZV9ybmFzZXEiLCAianV2ZW5pbGUiLCAic3BsaWNpbmciKQoKcmVtb3ZlX3hfYXhpc19tb2RlbHMgPC0gYygiZW5oYW5jZXIiLCAiY2NsZV9ybmFzZXEiLCAianV2ZW5pbGUiKQprZWVwX2xlZ2VuZF94X21vZGVscyA8LSBjKCJlbmhhbmNlciIpCmtlZXBfbGVnZW5kX3lfbW9kZWxzIDwtIGMoImxpbmVhciIsICJsc3NfM21fMnIiLCAiaGllcl9wb2x5XzNtXzJyIiwgImxpbmVhcl9sc3NfM21fMnIiKQoKZm9yICh5X21vZGVsIGluIHlfbW9kZWxzKSB7CiAgY2F0KHNwcmludGYoIlxuXG4jIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfVxuXG4iLCB5X21vZGVsKSkKICBmb3IgKHhfbW9kZWwgaW4geF9tb2RlbHMpIHsKICAgIGNhdChzcHJpbnRmKCJcblxuIyMjICVzIFxuXG4iLCB4X21vZGVsKSkKICAgIHBsdF9scyA8LSBsaXN0KCkKICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzX2RncF9vbWl0dGVkX3ZhcnMiLCB4X21vZGVsLCB5X21vZGVsKQogICAgc2ltX3RpdGxlIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgIHhfbW9kZWwgPT0gImNjbGVfcm5hc2VxIiB+ICJDQ0xFIiwKICAgICAgeF9tb2RlbCA9PSAic3BsaWNpbmciIH4gIlNwbGljaW5nIiwKICAgICAgeF9tb2RlbCA9PSAiZW5oYW5jZXIiIH4gIkVuaGFuY2VyIiwKICAgICAgeF9tb2RlbCA9PSAianV2ZW5pbGUiIH4gIkp1dmVuaWxlIgogICAgKQogICAgbWV0cmljX25hbWUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgbWV0cmljID09ICJyb2NhdWMiIH4gIkFVUk9DIiwKICAgICAgbWV0cmljID09ICJwcmF1YyIgfiAiUFJBVUMiCiAgICApCiAgICBmbmFtZSA8LSBmaWxlLnBhdGgocmVzdWx0c19kaXIsIHBhc3RlMCgiZ21kaS5yZWdyZXNzaW9uX3NpbXMuIiwgc2ltX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInZhcnlpbmdfIiwgdmFyeV9wYXJhbV9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJzZWVkIiwgc2VlZCksICJyZXN1bHRzIikKICAgIGlmIChmaWxlLmV4aXN0cyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpICYgcGFyYW1zJHVzZV9jYWNoZWQpIHsKICAgICAgcmVzdWx0cyA8LSByZWFkUkRTKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgaWYgKGxlbmd0aChzZXRkaWZmKHNob3dfbWV0aG9kcywgdW5pcXVlKHJlc3VsdHMkbWV0aG9kKSkpID4gMCkgewogICAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMoKQogICAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgfQogICAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgICAgZm9yIChoIGluIGhlcml0YWJpbGl0aWVzKSB7CiAgICAgICAgcGx0IDwtIHJlc3VsdHMgJT4lCiAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGhlcml0YWJpbGl0eSA9PSAhIWgpICU+JQogICAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICAgIHhfc3RyID0gInNhbXBsZV9yb3dfbiIsCiAgICAgICAgICAgIGZhY2V0X3N0ciA9IE5VTEwsCiAgICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgICBsZWdlbmRfcG9zaXRpb24gPSBsZWdlbmRfcG9zaXRpb24sCiAgICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZSwKICAgICAgICAgICAgaW5zaWRlX2xlZ2VuZCA9IFRSVUUKICAgICAgICAgICkgKwogICAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwgCiAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIKICAgICAgICAgICkKICAgICAgICBpZiAoaCAhPSBoZXJpdGFiaWxpdGllc1sxXSkgewogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICB9CiAgICAgICAgaWYgKHhfbW9kZWwgJWluJSByZW1vdmVfeF9heGlzX21vZGVscykgewogICAgICAgICAgaGVpZ2h0IDwtIDIuNzIKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhlaWdodCA8LSAzCiAgICAgICAgfQogICAgICAgIGlmICghKChoID09IGhlcml0YWJpbGl0aWVzW2xlbmd0aChoZXJpdGFiaWxpdGllcyldKSAmIAogICAgICAgICAgICAgICh4X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeF9tb2RlbHMpICYgCiAgICAgICAgICAgICAgKHlfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF95X21vZGVscykpKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6Z3VpZGVzKGNvbG9yID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikKICAgICAgICB9CiAgICAgICAgcGx0X2xzW1thcy5jaGFyYWN0ZXIoaCldXSA8LSBwbHQKICAgICAgfQogICAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgbnJvdyA9IDEpCiAgICAgIGdncGxvdDI6Omdnc2F2ZSgKICAgICAgICBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJhcHBlbmRpeCIsIAogICAgICAgICAgICAgICAgICBzcHJpbnRmKCJtaXNzcGVjaWZpZWRfcmVncmVzc2lvbl9zaW1zXyVzXyVzXyVzX2VycmJhcnMucGRmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICB5X21vZGVsLCB4X21vZGVsLCBtZXRyaWMpKSwKICAgICAgICBwbG90ID0gcGx0LCB1bml0cyA9ICJpbiIsIHdpZHRoID0gMTQsIGhlaWdodCA9IGhlaWdodAogICAgICApCiAgICB9IGVsc2UgewogICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgZmFjZXRfc3RyID0gImhlcml0YWJpbGl0eV9uYW1lIiwKICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lCiAgICAgICAgKSArCiAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsCiAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiLAogICAgICAgICAgdGl0bGUgPSBzcHJpbnRmKCIlcyIsIHNpbV90aXRsZSkKICAgICAgICApCiAgICAgIHZ0aGVtZXM6OnN1YmNodW5raWZ5KHBsb3RfZnVuKHBsdCksIGkgPSBjaHVua19pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMpCiAgICAgIGNodW5rX2lkeCA8LSBjaHVua19pZHggKyAxCiAgICB9CiAgfQp9CgpgYGAKCgojIFZhcnlpbmcgU3BhcnNpdHkgey50YWJzZXQgLnRhYnNldC12bW9kZXJufQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9CmtlZXBfbWV0aG9kcyA8LSBjb2xvcl9kZiRuYW1lICVpbiUgYygiR01ESV9yaWRnZV9SRiIsICJNREFfUkYiLCAiTURJX1JGIiwgIk1ESS1vb2JfUkYiLCAiVHJlZVNIQVBfUkYiKQptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSBjb2xvcl9kZiRjb2xvcltrZWVwX21ldGhvZHNdCnNob3dfbWV0aG9kcyA8LSBjb2xvcl9kZiRuYW1lW2tlZXBfbWV0aG9kc10KbWV0aG9kX2xhYmVscyA8LSBjb2xvcl9kZiRsYWJlbFtrZWVwX21ldGhvZHNdCmFscGhhX3ZhbHVlcyA8LSBjKDEsIHJlcCgwLjQsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDEpKQpsZWdlbmRfcG9zaXRpb24gPC0gYygwLjczLCAwLjcpCgp5X21vZGVscyA8LSBjKCJsaW5lYXIiLCAibHNzXzNtXzJyIiwgImhpZXJfcG9seV8zbV8yciIsICJsaW5lYXJfbHNzXzNtXzJyIikKeF9tb2RlbHMgPC0gYygianV2ZW5pbGUiLCAic3BsaWNpbmciKQoKcmVtb3ZlX3hfYXhpc19tb2RlbHMgPC0gYygic3BsaWNpbmciKQprZWVwX2xlZ2VuZF94X21vZGVscyA8LSBjKCJzcGxpY2luZyIpCmtlZXBfbGVnZW5kX3lfbW9kZWxzIDwtIGMoImxpbmVhciIsICJsaW5lYXJfbHNzXzNtXzJyIikKCmZvciAoeV9tb2RlbCBpbiB5X21vZGVscykgewogIGNhdChzcHJpbnRmKCJcblxuIyMgJXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX1cblxuIiwgeV9tb2RlbCkpCiAgZm9yICh4X21vZGVsIGluIHhfbW9kZWxzKSB7CiAgICBjYXQoc3ByaW50ZigiXG5cbiMjIyAlcyBcblxuIiwgeF9tb2RlbCkpCiAgICBwbHRfbHMgPC0gbGlzdCgpCiAgICBzaW1fbmFtZSA8LSBzcHJpbnRmKCIlc18lc19kZ3AiLCB4X21vZGVsLCB5X21vZGVsKQogICAgc2ltX3RpdGxlIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgIHhfbW9kZWwgPT0gImNjbGVfcm5hc2VxIiB+ICJDQ0xFIiwKICAgICAgeF9tb2RlbCA9PSAic3BsaWNpbmciIH4gIlNwbGljaW5nIiwKICAgICAgeF9tb2RlbCA9PSAiZW5oYW5jZXIiIH4gIkVuaGFuY2VyIiwKICAgICAgeF9tb2RlbCA9PSAianV2ZW5pbGUiIH4gIkp1dmVuaWxlIgogICAgKQogICAgbWV0cmljX25hbWUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgbWV0cmljID09ICJyb2NhdWMiIH4gIkFVUk9DIiwKICAgICAgbWV0cmljID09ICJwcmF1YyIgfiAiUFJBVUMiCiAgICApCiAgICB4X3N0ciA8LSBpZmVsc2UoeV9tb2RlbCA9PSAibGluZWFyIiwgInMiLCAibSIpCiAgICB2YXJ5X3BhcmFtX25hbWUgPC0gc3ByaW50ZigiaGVyaXRhYmlsaXR5XyVzIiwgeF9zdHIpCiAgICBmbmFtZSA8LSBmaWxlLnBhdGgocmVzdWx0c19kaXIsIHBhc3RlMCgiZ21kaS5vdGhlcl9yZWdyZXNzaW9uX3NpbXMudmFyeWluZ19zcGFyc2l0eS4iLCBzaW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgidmFyeWluZ18iLCB2YXJ5X3BhcmFtX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInNlZWQiLCBzZWVkKSwgInJlc3VsdHMiKQogICAgaWYgKGZpbGUuZXhpc3RzKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkgJiBwYXJhbXMkdXNlX2NhY2hlZCkgewogICAgICByZXN1bHRzIDwtIHJlYWRSRFMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICBpZiAobGVuZ3RoKHNldGRpZmYoc2hvd19tZXRob2RzLCB1bmlxdWUocmVzdWx0cyRtZXRob2QpKSkgPiAwKSB7CiAgICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICB9CiAgICBpZiAocGFyYW1zJGZvcl9wYXBlcikgewogICAgICBmb3IgKGggaW4gaGVyaXRhYmlsaXRpZXMpIHsKICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5ID09ICEhaCkgJT4lCiAgICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICAgIG1ldHJpYyA9IG1ldHJpYywKICAgICAgICAgICAgeF9zdHIgPSB4X3N0ciwKICAgICAgICAgICAgZmFjZXRfc3RyID0gTlVMTCwKICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICAgIGxlZ2VuZF9wb3NpdGlvbiA9IGxlZ2VuZF9wb3NpdGlvbiwKICAgICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lLAogICAgICAgICAgICBpbnNpZGVfbGVnZW5kID0gVFJVRQogICAgICAgICAgKSArCiAgICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgICB4ID0gdG91cHBlcih4X3N0ciksIHkgPSBtZXRyaWNfbmFtZSwgCiAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIKICAgICAgICAgICkKICAgICAgICBpZiAoaCAhPSBoZXJpdGFiaWxpdGllc1sxXSkgewogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICB9CiAgICAgICAgaWYgKHhfbW9kZWwgJWluJSByZW1vdmVfeF9heGlzX21vZGVscykgewogICAgICAgICAgaGVpZ2h0IDwtIDIuNzIKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhlaWdodCA8LSAzCiAgICAgICAgfQogICAgICAgIGlmICghKChoID09IGhlcml0YWJpbGl0aWVzW2xlbmd0aChoZXJpdGFiaWxpdGllcyldKSAmIAogICAgICAgICAgICAgICh4X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeF9tb2RlbHMpICYgCiAgICAgICAgICAgICAgKHlfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF95X21vZGVscykpKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6Z3VpZGVzKGNvbG9yID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikKICAgICAgICB9CiAgICAgICAgcGx0X2xzW1thcy5jaGFyYWN0ZXIoaCldXSA8LSBwbHQKICAgICAgfQogICAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgbnJvdyA9IDEpCiAgICAgIGdncGxvdDI6Omdnc2F2ZSgKICAgICAgICBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJhcHBlbmRpeCIsIAogICAgICAgICAgICAgICAgICBzcHJpbnRmKCJyZWdyZXNzaW9uX3NpbXNfc3BhcnNpdHlfJXNfJXNfJXNfZXJyYmFycy5wZGYiLAogICAgICAgICAgICAgICAgICAgICAgICAgIHlfbW9kZWwsIHhfbW9kZWwsIG1ldHJpYykpLAogICAgICAgIHBsb3QgPSBwbHQsIHVuaXRzID0gImluIiwgd2lkdGggPSAxNCwgaGVpZ2h0ID0gMwogICAgICApCiAgICB9IGVsc2UgewogICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICB4X3N0ciA9IHhfc3RyLAogICAgICAgICAgZmFjZXRfc3RyID0gImhlcml0YWJpbGl0eV9uYW1lIiwKICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lCiAgICAgICAgKSArCiAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgIHggPSB0b3VwcGVyKHhfc3RyKSwgeSA9IG1ldHJpY19uYW1lLAogICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIiwKICAgICAgICAgIHRpdGxlID0gc3ByaW50ZigiJXMiLCBzaW1fdGl0bGUpCiAgICAgICAgKQogICAgICB2dGhlbWVzOjpzdWJjaHVua2lmeShwbG90X2Z1bihwbHQpLCBpID0gY2h1bmtfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zKQogICAgICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQogICAgfQogIH0KfQoKYGBgCgoKIyBWYXJ5aW5nIFwjIEZlYXR1cmVzIHsudGFic2V0IC50YWJzZXQtdm1vZGVybn0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQprZWVwX21ldGhvZHMgPC0gY29sb3JfZGYkbmFtZSAlaW4lIGMoIkdNRElfcmlkZ2VfUkYiLCAiTURBX1JGIiwgIk1ESV9SRiIsICJNREktb29iX1JGIiwgIlRyZWVTSEFQX1JGIikKbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gY29sb3JfZGYkY29sb3Jba2VlcF9tZXRob2RzXQpzaG93X21ldGhvZHMgPC0gY29sb3JfZGYkbmFtZVtrZWVwX21ldGhvZHNdCm1ldGhvZF9sYWJlbHMgPC0gY29sb3JfZGYkbGFiZWxba2VlcF9tZXRob2RzXQphbHBoYV92YWx1ZXMgPC0gYygxLCByZXAoMC40LCBsZW5ndGgobWV0aG9kX2xhYmVscykgLSAxKSkKbGVnZW5kX3Bvc2l0aW9uIDwtIGMoMC43MywgMC40KQoKdmFyeV9wYXJhbV9uYW1lIDwtICJoZXJpdGFiaWxpdHlfc2FtcGxlX2NvbF9uIgp5X21vZGVscyA8LSBjKCJsaW5lYXIiLCAibHNzXzNtXzJyIiwgImhpZXJfcG9seV8zbV8yciIsICJsaW5lYXJfbHNzXzNtXzJyIikKeF9tb2RlbHMgPC0gYygiY2NsZV9ybmFzZXEiKQoKcmVtb3ZlX3hfYXhpc19tb2RlbHMgPC0gYygibGluZWFyIiwgImxzc18zbV8yciIsICJoaWVyX3BvbHlfM21fMnIiKQprZWVwX2xlZ2VuZF94X21vZGVscyA8LSBjKCJjY2xlX3JuYXNlcSIpCmtlZXBfbGVnZW5kX3lfbW9kZWxzIDwtIGMoImxpbmVhciIpCgpmb3IgKHlfbW9kZWwgaW4geV9tb2RlbHMpIHsKICBjYXQoc3ByaW50ZigiXG5cbiMjICVzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLnRhYnNldC1zcXVhcmV9XG5cbiIsIHlfbW9kZWwpKQogIGZvciAoeF9tb2RlbCBpbiB4X21vZGVscykgewogICAgY2F0KHNwcmludGYoIlxuXG4jIyMgJXMgXG5cbiIsIHhfbW9kZWwpKQogICAgcGx0X2xzIDwtIGxpc3QoKQogICAgc2ltX25hbWUgPC0gc3ByaW50ZigiJXNfJXNfZGdwIiwgeF9tb2RlbCwgeV9tb2RlbCkKICAgIHNpbV90aXRsZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICB4X21vZGVsID09ICJjY2xlX3JuYXNlcSIgfiAiQ0NMRSIsCiAgICAgIHhfbW9kZWwgPT0gInNwbGljaW5nIiB+ICJTcGxpY2luZyIsCiAgICAgIHhfbW9kZWwgPT0gImVuaGFuY2VyIiB+ICJFbmhhbmNlciIsCiAgICAgIHhfbW9kZWwgPT0gImp1dmVuaWxlIiB+ICJKdXZlbmlsZSIKICAgICkKICAgIG1ldHJpY19uYW1lIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgIG1ldHJpYyA9PSAicm9jYXVjIiB+ICJBVVJPQyIsCiAgICAgIG1ldHJpYyA9PSAicHJhdWMiIH4gIlBSQVVDIgogICAgKQogICAgZm5hbWUgPC0gZmlsZS5wYXRoKHJlc3VsdHNfZGlyLCBwYXN0ZTAoImdtZGkub3RoZXJfcmVncmVzc2lvbl9zaW1zLnZhcnlpbmdfcC4iLCBzaW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgidmFyeWluZ18iLCB2YXJ5X3BhcmFtX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInNlZWQiLCBzZWVkKSwgInJlc3VsdHMiKQogICAgaWYgKGZpbGUuZXhpc3RzKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkgJiBwYXJhbXMkdXNlX2NhY2hlZCkgewogICAgICByZXN1bHRzIDwtIHJlYWRSRFMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICBpZiAobGVuZ3RoKHNldGRpZmYoc2hvd19tZXRob2RzLCB1bmlxdWUocmVzdWx0cyRtZXRob2QpKSkgPiAwKSB7CiAgICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICB9CiAgICBpZiAocGFyYW1zJGZvcl9wYXBlcikgewogICAgICBmb3IgKGggaW4gaGVyaXRhYmlsaXRpZXMpIHsKICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5ID09ICEhaCkgJT4lCiAgICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICAgIG1ldHJpYyA9IG1ldHJpYywKICAgICAgICAgICAgeF9zdHIgPSAic2FtcGxlX2NvbF9uIiwKICAgICAgICAgICAgZmFjZXRfc3RyID0gTlVMTCwKICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICAgIGxlZ2VuZF9wb3NpdGlvbiA9IGxlZ2VuZF9wb3NpdGlvbiwKICAgICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lLAogICAgICAgICAgICBpbnNpZGVfbGVnZW5kID0gVFJVRQogICAgICAgICAgKSArCiAgICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgICB4ID0gIk51bWJlciBvZiBGZWF0dXJlcyIsIHkgPSBtZXRyaWNfbmFtZSwgCiAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIKICAgICAgICAgICkKICAgICAgICBpZiAoaCAhPSBoZXJpdGFiaWxpdGllc1sxXSkgewogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICB9CiAgICAgICAgaWYgKHlfbW9kZWwgJWluJSByZW1vdmVfeF9heGlzX21vZGVscykgewogICAgICAgICAgaGVpZ2h0IDwtIDIuNzIKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhlaWdodCA8LSAzCiAgICAgICAgfQogICAgICAgIGlmICghKChoID09IGhlcml0YWJpbGl0aWVzW2xlbmd0aChoZXJpdGFiaWxpdGllcyldKSAmIAogICAgICAgICAgICAgICh4X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeF9tb2RlbHMpICYgCiAgICAgICAgICAgICAgKHlfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF95X21vZGVscykpKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6Z3VpZGVzKGNvbG9yID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikKICAgICAgICB9CiAgICAgICAgcGx0X2xzW1thcy5jaGFyYWN0ZXIoaCldXSA8LSBwbHQKICAgICAgfQogICAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgbnJvdyA9IDEpCiAgICAgIGdncGxvdDI6Omdnc2F2ZSgKICAgICAgICBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJhcHBlbmRpeCIsIAogICAgICAgICAgICAgICAgICBzcHJpbnRmKCJyZWdyZXNzaW9uX3NpbXNfdmFyeV9wXyVzXyVzXyVzX2VycmJhcnMucGRmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICB5X21vZGVsLCB4X21vZGVsLCBtZXRyaWMpKSwKICAgICAgICBwbG90ID0gcGx0LCB1bml0cyA9ICJpbiIsIHdpZHRoID0gMTQsIGhlaWdodCA9IGhlaWdodAogICAgICApCiAgICB9IGVsc2UgewogICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfY29sX24iLAogICAgICAgICAgZmFjZXRfc3RyID0gImhlcml0YWJpbGl0eV9uYW1lIiwKICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lCiAgICAgICAgKSArCiAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgIHggPSAiTnVtYmVyIG9mIEZlYXR1cmVzIiwgeSA9IG1ldHJpY19uYW1lLAogICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIiwKICAgICAgICAgIHRpdGxlID0gc3ByaW50ZigiJXMiLCBzaW1fdGl0bGUpCiAgICAgICAgKQogICAgICB2dGhlbWVzOjpzdWJjaHVua2lmeShwbG90X2Z1bihwbHQpLCBpID0gY2h1bmtfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zKQogICAgICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQogICAgfQogIH0KfQoKYGBgCgoKIyBHTURJIE1vZGVsaW5nIENob2ljZXMgey50YWJzZXQgLnRhYnNldC12bW9kZXJufQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9Cm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGMobWFudWFsX2NvbG9yX3BhbGV0dGVfY2hvaWNlc1ttZXRob2RfbGFiZWxzX2Nob2ljZXMgPT0gIk1ESSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlX2Nob2ljZXNbbWV0aG9kX2xhYmVsc19jaG9pY2VzID09ICJNREktb29iIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiNBRjREOTgiLCAiI0ZGRDkyRiIsICIjRkM4RDYyIiwgImJsYWNrIikKc2hvd19tZXRob2RzIDwtIGMoIk1ESV9SRiIsICJNREktb29iX1JGIiwgIkdNRElfcmF3X1JGIiwgIkdNRElfbG9vX1JGIiwgIkdNRElfb2xzX3Jhd19sb29fUkYiLCAiR01ESV9yaWRnZV9yYXdfbG9vX1JGIikKbWV0aG9kX2xhYmVscyA8LSBjKCJNREkiLCAiTURJLW9vYiIsICJHTURJIChyYXcgb25seSkiLCAiR01ESSAobG9vIG9ubHkpIiwgIkdNREkgKHJhdytsb28gb25seSkiLCAiR01ESSAocmlkZ2UrcmF3K2xvbykiKQphbHBoYV92YWx1ZXMgPC0gcmVwKDEsIGxlbmd0aChtZXRob2RfbGFiZWxzKSkKbGVnZW5kX3Bvc2l0aW9uIDwtIGMoMC42MywgMC40KQoKdmFyeV9wYXJhbV9uYW1lIDwtICJoZXJpdGFiaWxpdHlfc2FtcGxlX3Jvd19uIgp5X21vZGVscyA8LSBjKCJsaW5lYXIiLCAiaGllcl9wb2x5XzNtXzJyIikKeF9tb2RlbHMgPC0gYygiZW5oYW5jZXIiLCAiY2NsZV9ybmFzZXEiKSMsICJzcGxpY2luZyIpCm1pbl9zYW1wbGVzX3Blcl9sZWFmcyA8LSBjKDUsIDEpCgpyZW1vdmVfeF9heGlzX21vZGVscyA8LSBjKCJlbmhhbmNlciIpCmtlZXBfbGVnZW5kX3hfbW9kZWxzIDwtIGMoImVuaGFuY2VyIikKa2VlcF9sZWdlbmRfeV9tb2RlbHMgPC0gYygibGluZWFyIikKCmZvciAoeV9tb2RlbCBpbiB5X21vZGVscykgewogIGNhdChzcHJpbnRmKCJcblxuIyMgJXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX1cblxuIiwgeV9tb2RlbCkpCiAgZm9yICh4X21vZGVsIGluIHhfbW9kZWxzKSB7CiAgICBjYXQoc3ByaW50ZigiXG5cbiMjIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtY2lyY2xlfVxuXG4iLCB4X21vZGVsKSkKICAgIHBsdF9scyA8LSBsaXN0KCkKICAgIGZvciAobWluX3NhbXBsZXNfcGVyX2xlYWYgaW4gbWluX3NhbXBsZXNfcGVyX2xlYWZzKSB7CiAgICAgIGNhdChzcHJpbnRmKCJcblxuIyMjIyBtaW5fc2FtcGxlc19wZXJfbGVhZiA9ICVzIFxuXG4iLCBtaW5fc2FtcGxlc19wZXJfbGVhZikpCiAgICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzX2RncCIsIHhfbW9kZWwsIHlfbW9kZWwpCiAgICAgIHNpbV90aXRsZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICAgIHhfbW9kZWwgPT0gImNjbGVfcm5hc2VxIiB+ICJDQ0xFIiwKICAgICAgICB4X21vZGVsID09ICJzcGxpY2luZyIgfiAiU3BsaWNpbmciLAogICAgICAgIHhfbW9kZWwgPT0gImVuaGFuY2VyIiB+ICJFbmhhbmNlciIsCiAgICAgICAgeF9tb2RlbCA9PSAianV2ZW5pbGUiIH4gIkp1dmVuaWxlIgogICAgICApCiAgICAgIG1ldHJpY19uYW1lIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgICAgbWV0cmljID09ICJyb2NhdWMiIH4gIkFVUk9DIiwKICAgICAgICBtZXRyaWMgPT0gInByYXVjIiB+ICJQUkFVQyIKICAgICAgKQogICAgICBmbmFtZSA8LSBmaWxlLnBhdGgocmVzdWx0c19kaXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiZ21kaS5vdGhlcl9yZWdyZXNzaW9uX3NpbXMubW9kZWxpbmdfY2hvaWNlc19taW5fc2FtcGxlcyVzLiVzIiwgbWluX3NhbXBsZXNfcGVyX2xlYWYsIHNpbV9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInZhcnlpbmdfIiwgdmFyeV9wYXJhbV9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInNlZWQiLCBzZWVkKSwgInJlc3VsdHMiKQogICAgICBpZiAoIWZpbGUuZXhpc3RzKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkpIHsKICAgICAgICBuZXh0CiAgICAgIH0KICAgICAgaWYgKGZpbGUuZXhpc3RzKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkgJiBwYXJhbXMkdXNlX2NhY2hlZCkgewogICAgICAgIHJlc3VsdHMgPC0gcmVhZFJEUyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgICAgaWYgKGxlbmd0aChzZXRkaWZmKHNob3dfbWV0aG9kcywgdW5pcXVlKHJlc3VsdHMkbWV0aG9kKSkpID4gMCkgewogICAgICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgfQogICAgICBpZiAocGFyYW1zJGZvcl9wYXBlcikgewogICAgICAgIGZvciAoaCBpbiBoZXJpdGFiaWxpdGllcykgewogICAgICAgICAgcGx0IDwtIHJlc3VsdHMgJT4lCiAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5ID09ICEhaCkgJT4lCiAgICAgICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICAgICAgeF9zdHIgPSAic2FtcGxlX3Jvd19uIiwKICAgICAgICAgICAgICBmYWNldF9zdHIgPSBOVUxMLAogICAgICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgICAgIGxlZ2VuZF9wb3NpdGlvbiA9IGxlZ2VuZF9wb3NpdGlvbiwKICAgICAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUsCiAgICAgICAgICAgICAgaW5zaWRlX2xlZ2VuZCA9IFRSVUUKICAgICAgICAgICAgKSArCiAgICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwgCiAgICAgICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIgogICAgICAgICAgICApICsKICAgICAgICAgICAgZ2dwbG90Mjo6dGhlbWUoCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDEyKQogICAgICAgICAgICApCiAgICAgICAgICBpZiAoaCAhPSBoZXJpdGFiaWxpdGllc1sxXSkgewogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgICAgfQogICAgICAgICAgaWYgKHhfbW9kZWwgJWluJSByZW1vdmVfeF9heGlzX21vZGVscykgewogICAgICAgICAgICBoZWlnaHQgPC0gMi43MgogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS54ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaGVpZ2h0IDwtIDMKICAgICAgICAgIH0KICAgICAgICAgIGlmICghKChoID09IGhlcml0YWJpbGl0aWVzW2xlbmd0aChoZXJpdGFiaWxpdGllcyldKSAmIAogICAgICAgICAgICAgICAgKHhfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF94X21vZGVscykgJiAKICAgICAgICAgICAgICAgICh5X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeV9tb2RlbHMpKSkgewogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6Z3VpZGVzKGNvbG9yID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikKICAgICAgICAgIH0KICAgICAgICAgIHBsdF9sc1tbYXMuY2hhcmFjdGVyKGgpXV0gPC0gcGx0CiAgICAgICAgfQogICAgICAgIHBsdCA8LSBwYXRjaHdvcms6OndyYXBfcGxvdHMocGx0X2xzLCBucm93ID0gMSkKICAgICAgICBnZ3Bsb3QyOjpnZ3NhdmUoCiAgICAgICAgICBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJhcHBlbmRpeCIsCiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigicmVncmVzc2lvbl9zaW1zX2Nob2ljZXNfbWluX3NhbXBsZXMlc18lc18lc18lc19lcnJiYXJzLnBkZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fc2FtcGxlc19wZXJfbGVhZiwgeV9tb2RlbCwgeF9tb2RlbCwgbWV0cmljKSksCiAgICAgICAgICBwbG90ID0gcGx0LCB1bml0cyA9ICJpbiIsIHdpZHRoID0gMTQsIGhlaWdodCA9IGhlaWdodAogICAgICAgICkKICAgICAgfSBlbHNlIHsKICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgICBmYWNldF9zdHIgPSAiaGVyaXRhYmlsaXR5X25hbWUiLAogICAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lCiAgICAgICAgICApICsKICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsCiAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIsCiAgICAgICAgICAgIHRpdGxlID0gc3ByaW50ZigiJXMiLCBzaW1fdGl0bGUpCiAgICAgICAgICApCiAgICAgICAgdnRoZW1lczo6c3ViY2h1bmtpZnkocGxvdF9mdW4ocGx0KSwgaSA9IGNodW5rX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zKQogICAgICAgIGNodW5rX2lkeCA8LSBjaHVua19pZHggKyAxCiAgICAgIH0KICAgIH0KICB9Cn0KCmBgYAoK